Selenium 在并行运行测试时处理 ProtocolHandshake 错误

我尝试练习使用 TestNG invocationCountthreadPoolSize 并行执行测试.

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.

相关文章