我正在寻找在我的java selenium测试中实现FluentWaits的解决方案。 问题是使用ThreadLocal将我的驱动程序声明为thead-local以并行运行它们。
这是我的代码:
//My variable declaration
protected ThreadLocal<RemoteWebDriver> threadDriverFirefox = null;
//I create one for my thread in my BeforeTest
threadDriverFirefox = new ThreadLocal<RemoteWebDriver>();
threadDriverFirefox.set(new RemoteWebDriver(new URL(urlnode), DesiredCapabilities.firefox()));
//Add this method to get my driver
public WebDriver driverFirefox() {
return threadDriverFirefox.get();
}
//And use it like this in my test
driverFirefox().get(weburl);
我的问题是driverFirefox() 我无法找到在FluentWait结构中实现它的方法:
Wait waitfluent = new FluentWait(driverFirefox()).withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(2, TimeUnit.SECONDS).ignoring(NoSuchElementException.class);
WebElement testElement = waitfluent.until(new Function() {
public WebElement apply(WebDriver driverFirefox() ) {
return WebDriver driverFirefox().findElement(By.id("logEmailField"));
}
});
但是我的语法错误......
此行有多个标记 - 令牌上的语法错误&#34;)&#34;,删除此令牌 - 令牌上的语法错误,放错位置 构建体(S)
有什么想法来解决它吗?
谢谢
答案 0 :(得分:2)
如果你使用ThreadLocal,它应该是静态的,否则你可能会引入令人讨厌的内存泄漏。如果ThreadLocal是静态的,那么应该以这种方式访问它。此外,由于共享引用,您不应该通过线程(引用)初始化它,而只应该通过值(调用set()
)来初始化它。
public class TestContext {
static ThreadLocal<WebDriver> CURRENT_DRIVER = new ThreadLocal<>();
public static WebDriver currentDriver(){
return CURRENT_DRIVER.get();
}
public void beforeTest(RemoteWebDriver driver) {
CURRENT_DRIVER.set(driver);
}
}
现在您可以使用共享驱动程序定义流畅的等待:
Wait waitfluent = new FluentWait(TestContext.currentDriver())
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(2, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);