如何在Python中同时运行两个(或更多)Selenium的webdrivers?[duplicate]

iezvtpos  于 2023-01-26  发布在  Python
关注(0)|答案(3)|浏览(501)
    • 此问题在此处已有答案**:

Python selenium multiprocessing(3个答案)
4天前关闭。
我正尝试使用Python同时运行两个(或更多)Selenium webdriver
到目前为止,我已经尝试过使用Python的多处理模块,我是这样使用它的:

def _():
    sets = list()
    pool = Pool()
    for i in range(len(master)):
        driver = setProxy(proxy,f'Tread#{i+1}')
        sets.append(
            [f'Thread#{i+1}',
            driver,
            master[i]]
        )
    for i in range(len(sets)):
        pool.apply_async(enterPoint, args=(sets[i][0],sets[i][1],sets[i][2]))
    pool.close()
    pool.join()

上面的函数调用setProxy()来获取一个设置了代理的驱动程序示例,该示例运行良好,打开chromedriver len(master)的次数和访问一个链接来检查IP。sets列表是一个列表列表列表,由3个对象组成,分别是线程号、将运行的驱动程序和驱动程序将使用的数据列表。池的apply_async()应该运行enterPoint()len(sets)次,args是线程号、驱动程序和数据以下是enterPoint代码:

def enterPoint(thread,driver,accounts):
    print('I exist!')
    for account in accounts:
        cEEPE(thread,driver,account)

但是,"I exist"语句从来不会在我运行应用程序的CLI中打印出来。cEEPE()就是神奇的地方。我测试了我的代码,没有对它应用多处理,它正常工作。我怀疑Pool的apply_async()方法有问题,我可能用错了方法。

ht4b089n

ht4b089n1#

问题中提供的代码是孤立的,因此很难评论,但我会考虑使用这个过程描述的问题:
1.导入multiprocessingselenium
1.使用startjoin方法。
这将产生您所要求的两个(或更多)进程。

import multiprocessing
from selenium import webdriver

def open_browser(name):
    driver = webdriver.Firefox()
    driver.get("http://www.google.com")
    print(name, driver.title)
    driver.quit()

if __name__ == '__main__':
    process1 = multiprocessing.Process(target=open_browser, args=("Process-1",))
    process2 = multiprocessing.Process(target=open_browser, args=("Process-2",))

    process1.start()
    process2.start()

    process1.join()
    process2.join()
uyto3xhc

uyto3xhc2#

所以,我得到了上面的代码工作,这里是我如何修复它:而不是像这样编写apply_async()方法:

pool.apply_async(enterPoint, args=(sets[i][0],sets[i][1],sets[i][2]))

我是这样写:

pool.apply_async(enterPoint(sets[i][0],sets[i][1],sets[i][2]))

但尽管如此,这并不能解决我的问题,因为我希望enterPoint同时运行两次。

ckx4rj1h

ckx4rj1h3#

它可以通过SeleniumBase轻松完成,SeleniumBase可以进行多线程测试(例如:-n=3用于3个线程),甚至设置代理服务器(--proxy=USER:PASS@SERVER:PORT
pip install seleniumbase,然后运行python

from parameterized import parameterized
from seleniumbase import BaseCase
BaseCase.main(__name__, __file__, "-n=3")

class GoogleTests(BaseCase):
    @parameterized.expand(
        [
            ["Download Python", "Download Python", "img.python-logo"],
            ["Wikipedia", "www.wikipedia.org", "img.central-featured-logo"],
            ["SeleniumBase.io Docs", "SeleniumBase", 'img[alt*="SeleniumB"]'],
        ]
    )
    def test_parameterized_google_search(self, search_key, expected_text, img):
        self.open("https://google.com/ncr")
        self.hide_elements("iframe")
        self.type('input[title="Search"]', search_key + "\n")
        self.assert_text(expected_text, "#search")
        self.click('a:contains("%s")' % expected_text)
        self.assert_element(img)

(This示例使用参数化将一个测试转换为三个不同的测试。)您还可以将多线程应用于多个文件等。

相关问题