首页 > 解决方案 > Python中的selenium webdriver中的线程

问题描述

我正在尝试习惯 Selenium WebDriver。通过那个,我正在尝试登录并在我的目标网站上做一些事情。在代码中,我尝试登录 10 个用户。但是,正如预期的那样,这不是最好的方法。我首先关心的是如何以更好的方式做到这一点,其次,如何为每个用户一次创建线程并同时启动。

# User threads
t1 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr1", "123456", True))
t2 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr2", "123456", True))
t3 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr3", "123456", True))
t4 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr4", "123456", True))
t5 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr5", "123456", True))
t6 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr6", "123456", True))
t7 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr7", "123456", True))
t8 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr8", "123456", True))
t9 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr9", "123456", True))
t10 = threading.Thread(target=user_qsinav_normal, args=("student@foo.com.tr10", "123456", True))

# Starting threads
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
t6.start()
t7.start()
t8.start()
t9.start()
t10.start()

我将代码更改如下:

# creating make up users in the function and return it as dict(email,pass)
users = number_of_users(6)

# logging in with users created before.
for user_email, user_passwoard in users.items():
    threading.Thread(target=user_qsinav_normal, args=(user_email, user_passwoard, True)).start()

标签: pythonmultithreadingselenium

解决方案


我认为要测试API,最好使用requests或其他一些工具。然后,您可以创建多个线程来轻松测试登录 API。

硒方面,线程不太好。如果您确实需要使用 Selenium 对其进行测试,我建议您不要使用 Thread。相反,我们应该使用 Selenium Grid 进行远程测试。

您可以从这里安装 Selenium Grid Docker:https ://github.com/SeleniumHQ/docker-selenium

创建一个网格(下例是 3 个独立的浏览器),您可以根据需要创建更多端口。

$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.0.0-alpha-7-prerelease-20200921
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -v /dev/shm:/dev/shm selenium/node-chrome:4.0.0-alpha-7-prerelease-20200921
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -v /dev/shm:/dev/shm selenium/node-firefox:4.0.0-alpha-7-prerelease-20200921
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -v /dev/shm:/dev/shm selenium/node-opera:4.0.0-alpha-7-prerelease-20200921

然后将您的测试指向端口:

from selenium import webdriver

firefox_options = webdriver.FirefoxOptions()
driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    options=firefox_options
)
driver.get("http://www.google.com")
driver.quit() 

您可以使用“线程”构建一个小型自定义引擎,以在集线器上运行 Selenium 测试。集线器将为您处理测试,并将响应您的线程。


推荐阅读