2016-05-03 2 views
0

Я ищу решение для внедрения FluentWaits в моем тесте java selenium. Проблема заключается в том, что использование ThreadLocal для объявления моих драйверов как thead-local для их параллельного запуска.FluentWait selenium с помощью ThreadLocal <RemoteWebDriver>

Вот мой код:

//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")); 
    } 
}); 

Но я» ve синтаксическая ошибка ...

Несколько маркеров в этой строке - Ошибка синтаксиса на t Oken ")", удалите этот маркер - ошибка синтаксиса на маркер (ы), неуместны конструкцию (ы)

Любая идея, чтобы это исправить?

Благодаря

+0

Ошибка синтаксиса находится в 'общественного WebElement применяется (WebDriver driverFirefox())' вы не можете объявить метод в качестве параметра подпись метода, просто удалите атрибут '()' to 'public WebElement apply (WebDriver driverFirefox) { return driverFirefox.findElement (By.id (" logEmailField "));' –

ответ

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); 
+0

Хорошо, хорошо, и могу ли я сделать это для конкретной элемент? – MxfrdA

+0

'currentDriver(). FindElement (By.id (" logEmailField "));' или 'WebElement apply (драйвер WebDriver) {return driver.findElement (By.id (" logEmailField "));}' –

+0

Я не задаю свой переменная waitfluent? – MxfrdA

Смежные вопросы