使用ThreadLocal <remotewebdriver>的FluentWait selenium

时间:2016-05-03 07:51:13

标签: java multithreading selenium testing wait

我正在寻找在我的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)

有什么想法来解决它吗?

谢谢

1 个答案:

答案 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);