【问题标题】:Selenium Python - Multiprocessing Only Controlling One BrowserSelenium Python - 仅控制一个浏览器的多处理
【发布时间】:2021-08-11 21:08:15
【问题描述】:

我正在尝试在本地运行 selenium 脚本并打开三个非无头浏览器。我正在使用多处理池(并且也尝试过常规的多处理)并且遇到了一个有趣的问题,即打开了 3 个浏览器会话,但只有第一个实际导航到 target_url 并尝试控制。另外两个只是坐等什么都不做。

这是相关的执行代码


    run_id = str(uuid.uuid4())



    options = Options()
    #options.binary_location = '/opt/headless-chromium' #works for lambda
    start_time = time.time()

    options.binary_location = '/usr/bin/google-chrome' #testing

    #options.add_argument('--headless') don't need headless
    options.add_argument('--no-sandbox')
    options.add_argument('--verbose')
    #options.add_argument('--single-process')
    options.add_argument('--user-data-dir=/tmp/user-data')# test add
    options.add_argument('--data-path=/tmp/data-path')
    options.add_argument('--disk-cache-dir=/tmp/cache-dir')
    options.add_argument('--homedir=/tmp')
    #options.add_argument('--disable-gpu')# test add
    #options.add_argument("--remote-debugging-port=9222") test remove
    #options.add_argument('--disable-dev-shm-usage')
        #'/opt/chromedriver' not found
    logger.info("Before driver initiated")
    # job_id = event['job_id']
    # run_id = event['run_id']

    send_log(job_id, run_id, "JOB START", True, "", time.time() - start_time)

    retries = 0

    drivers = []





        try:

            #driver = webdriver.Chrome('/opt/chromedriver_89', chrome_options=options)
            driver = webdriver.Chrome('/opt/chromedriver90', chrome_options=options)
            #driver2 = webdriver.Chrome('/opt/chromedriver90', chrome_options=options)

            break

        except Exception as e:
            print(str(e))

            logger.info('exception with driver instantiation, retrying... ' + str(e))
            #time.sleep(5)
            driver = None

            driver = webdriver.Chrome('/opt/chromedriver', chrome_options=options)


   ....

这是我调用每个进程的方式

        
from multiprocessing import Pool

pool = Pool(processes=3)

for i in range(3):
    pool.apply_async(invoke, args=("https://macau-flash-sale.myshopify.com/",))
pool.close()
pool.join()

是否有可能尽管有多个进程,但 selenium 无法与其他两个浏览器实例正常通信?

非常感谢任何想法!

【问题讨论】:

  • Selenium 不是异步的。你想切换到pyppeteer / python playwright

标签: python selenium selenium-chromedriver


【解决方案1】:

我不认为 selenium 可以同时处理多个浏览器。我建议编写 3 个不同的 python 脚本并通过终端一次运行它们。如果他们需要相互交流信息,可能最简单的方法就是让他们写入文本文件。

【讨论】:

  • 谢谢你,这也是我的理解!即使在运行与多个脚本完全相同的代码时,我也遇到了这个问题...
  • 经过进一步研究,您可以通过这种方式控制多个浏览器。问题在于为每个子进程指定相同的数据/用户目录
【解决方案2】:

对于其他为此苦苦挣扎的人,Selenium 可以与异步/多处理一起使用。

但您不能为每个会话指定相同的用户/数据目录。我必须删除这些参数,以便每个 chrome 会话为自己创建唯一的目录。

只需删除以下内容即可。

 options.add_argument('--user-data-dir=/tmp/user-data')# test add
    options.add_argument('--data-path=/tmp/data-path')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2011-03-03
    • 2022-12-05
    相关资源
    最近更新 更多