python - 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()
解决方案
我认为要测试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 测试。集线器将为您处理测试,并将响应您的线程。
推荐阅读
- azure-devops - 当我包含代码覆盖率时,无法获得 Azure DevOps Release Pipelines
- c - 在 gcc 中编译 c 时收到有关强制转换“从指针到不同大小的整数”的警告
- java - 无效标志:将 java 包升级到 1.8.0_211 后的 -jar
- python - 如何在 Subprocess.run 命令中使用 for 循环
- python-3.x - 如何让我的计算机识别用 python3 编写的代码?
- swift - 如何在 viewDidLoad 中调用 UIButton 的扩展
- routes - 默认控制器上的更改导致 404 Page Not Found
- rdf - Jena:如何使用 Jena 规则在本体图中更新(未添加)RDF 三元组
- python - 读取文件并在其中找到字谜
- javascript - 如何使用数据表中的选定项目作为数组使用 laravel 将每行列出的所有数据保存到数据库