Selenium handles ProtocolHandshake error while running tests parallel(Selenium 在并行运行测试时处理 ProtocolHandshake 错误)
问题描述
我尝试练习使用 TestNG invocationCount
和 threadPoolSize
并行执行测试.
I try practicing to execute tests in parallel using TestNG invocationCount
and threadPoolSize
.
A.我这样写了一个一体机测试,成功了
A. I write a all-in-one test like this, and it is successful
@Test(invocationCount = 5, threadPoolSize = 5)
public void testThreadPool() {
WebDriver driver = new ChromeDriver();
driver.get("http://www.google.com");
driver.findElement(By.name("q")).sendKeys("Amazon");
driver.quit();*/
}
=>5个Chrome浏览器同时打开(并行),测试成功.
=> 5 Chrome browsers are opened at the same time (parallel), and tests are successfully executed.
B.我在@before 和@after 中定义了我的测试,但它不起作用
B. I define my test in @before and @after, and it doesn't work
@BeforeTest
public void setUp() {
WebDriver driver = driverManager.setupDriver("chrome");
}
@Test(invocationCount = 5, threadPoolSize = 5)
public void testThreadPool() {
driver.get("http://www.google.com");
driver.findElement(By.name("q")).sendKeys("Amazon");
}
@AfterTest
public void tearDown() {
driver.quit()
}
=>打开1个chrome浏览器,好像刷新了5次,最后在文本字段中输入了5个亚马逊词,日志信息如下:
=> 1 chrome browser is opened, and it seems it is refreshed 5 times, and at the end, there are 5 Amazon words entered in text field, with the following log message:
[1593594530,792][SEVERE]: bind() failed: Cannot assign requested address (99)
ChromeDriver was started successfully.
Jul 01, 2020 11:08:51 AM org.openqa.selenium.remote.ProtocolHandshake createSession
我知道,对于 B,5 个线程使用相同的对象驱动程序,这就是为什么只打开一个 chrome.但我不知道在这种情况下如何管理驱动程序对象,因此我可以获得与 A 中相同的结果.
I understand that, with B, 5 threads use the same object driver, that's why only one chrome is opened. But I don't know how to manage driver object in this case so I can get the same result like in A.
任何想法表示赞赏.
推荐答案
你可以使用 ThreadLocal 类来让你的 webdriver 线程安全
You can use ThreadLocal class to make your webdriver Threadsafe
private ThreadLocal<WebDriver> webdriver = new ThreadLocal<WebDriver>();
@BeforeMethod
public void setUp() {
webdriver.set(driverManager.setupDriver("chrome"));
}
@Test(invocationCount = 5, threadPoolSize = 5)
public void testThreadPool() {
webdriver.get().get("http://www.google.com");
webdriver.get().findElement(By.name("q")).sendKeys("Amazon");
}
@AfterMethod
public void tearDown() {
webdriver.get().quit()
}
您需要在上述上下文中使用 BeforeMethod/AfterMethod.
Edit : You will need to use BeforeMethod/AfterMethod in above context.
这篇关于Selenium 在并行运行测试时处理 ProtocolHandshake 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Selenium 在并行运行测试时处理 ProtocolHandshake 错误


基础教程推荐
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 降序排序:Java Map 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01