2017-02-23 68 views
14

到目前爲止,我使用2.45.0版本的硒和我所有的等待都在這樣做的話:wait.until(ExpectedConditions)不工作任何更多的硒

WebDriverWait wait = new WebDriverWait(webKitUtility.getWebDriver(), 5); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("role"))); 

但我更新硒3.1.0而我得到的錯誤:

「的方法,直到(謂語)在類型FluentWait不適用於參數 (ExpectedCondition)」

我看到,從2.45.0到3.1.0一些事情已棄用。我試圖調查現在做什麼是最好的方法,但我不確定。我在google上發現的大部分內容都是舊信息,這些信息解釋的方式與我目前使用的方式相同。

回答

19

我有同樣的問題。

我固定它通過使用WebDriverWait將不會被棄用.until()方法,並通過添加以下到我的Maven的pom.xml:

<dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>21.0</version> 
</dependency> 

其他,我的代碼看起來完全像以前一樣。

更具體地說,現在有兩種方法。

老一(這是不建議使用):
public void until(final Predicate<T> isTrue) {}

和新:
public <V> V until(Function<? super T, V> isTrue) {}

+1

我去官方硒聊天室的人告訴我,做你做同樣的事情。它也適用於我。我來這裏發佈一個答案,但你已經做到了:)。 –

1

如果您正在使用Maven來管理你的依賴,檢查依賴等級和檢查番石榴正在使用的版本。 selenium-remote-driver JAR需要番石榴版本21.向使用不需要的番石榴版本的工件添加一個排除項。例如:

<dependency> 
<groupId>io.github.bonigarcia</groupId> 
<artifactId>webdrivermanager</artifactId> 
<version>1.5.1</version> 
    <exclusions> 
    <exclusion> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
0

您可以爲新FluentWait

new WebDriverWait(driver, 60).until(new Function<WebDriver, Boolean>() { 
    Boolean isWindowFound = Boolean.FALSE; 
     @Override 
     public Boolean apply(WebDriver driver) { 
      try { 
       driver.switchTo().window("Your Window Name"); 
       isWindowFound = Boolean.TRUE; 
      } catch (NoSuchWindowException e) { 
       System.out.println("Your Window Name not found"); 
       System.out.println(driver.getTitle()); 
       return isWindowFound; 
      } 
      return isWindowFound; 
     } 
    }); 
1

做這樣的事情你需要添加依賴性:

<dependency> 
     <groupId>org.seleniumhq.selenium</groupId> 
     <artifactId>selenium-support</artifactId> 
     <version>3.0.1</version> 
</dependency> 

這是爲了讓你的代碼仍然工作。雖然最終代碼將需要重寫,不要使用已棄用的FluentWait。

+0

FluentWait從Selenium 3.4.0開始似乎不推薦使用。 – seanf

1

當我從硒2(org.seleniumhq.selenium:selenium-java:2.53.0)更改爲硒3(org.seleniumhq.selenium:selenium-java:3.4.0)時,出現此編譯錯誤。

如上所述,我不得不從guava 18(guava:com.google.guava:18.0)變成番石榴21(guava:com.google.guava:21.0)。

不過,我也不得不配置構建使用Java 8,因爲

ExpectedCondition<T> extends Function<WebDriver, T> 
Function<F, T> extends java.util.function.Function<F, T> 

其中java.util.function.Function必須來自Java的8 JDK。

對於命令行,我將JAVA_HOME環境變量更改爲JAVA_HOME:C:\ Program Files \ Java \ jdk1.8。0_131

對於Eclipse,Windows - >首選項,Java /已安裝的JRE,添加按鈕,JRE主目錄:C:\ Program Files \ Java \ jdk1.8.0_131和JRE名稱:jdk1.8.0_131。

0

我正面臨着類似的問題作出番石榴版本以上變化21,改變了Maven插件配置版本,以 Maven的編譯器插件3.11.81.8
我仍然後與java.util.function與相同的錯誤stucked和建設失敗。解決方法是刪除Maven repo .m2文件夾並從頭開始導入項目,然後嘗試進行以下更改。在POM selenium java和selenium服務器版本中進行更改並嘗試對Maven進行更改後嘗試執行Maven更新干淨,然後安裝maven。不知怎的,在我的情況下,pom.xml仍然使用舊的硒版本。我將maven插件更改爲1.8後,將使用的jdk版本更改爲1.8,現在它對我來說完全正常

0

注意如果您使用的是Maven,則order of the dependencies do matter

例如:

public static void main(String[] args) { 
    System.setProperty("webdriver.gecko.driver", "/Users/me/geckodriver"); 
    final WebDriver driver = new FirefoxDriver(); 
    driver.get("https://www.google.com"); 
    final WebDriverWait wait = new WebDriverWait(driver, 5); 
    final By feelLuckyXpath = By.xpath("//div[@class='jsb']/center/input[@type='submit' and @name='btnI']"); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(feelLuckyXpath)).click(); 
    driver.close(); 
} 

此代碼工作正常與以下Maven的依賴關係:

<dependency> 
    <groupId>org.seleniumhq.selenium</groupId> 
    <artifactId>selenium-java</artifactId> 
    <version>3.8.1</version> 
</dependency> 

<dependency> 
    <groupId>com.google.api-client</groupId> 
    <artifactId>google-api-client</artifactId> 
    <version>1.22.0</version> 
</dependency> 

,但它可能會重新排序一個失敗:

<dependency> 
    <groupId>com.google.api-client</groupId> 
    <artifactId>google-api-client</artifactId> 
    <version>1.22.0</version> 
</dependency> 

<dependency> 
    <groupId>org.seleniumhq.selenium</groupId> 
    <artifactId>selenium-java</artifactId> 
    <version>3.8.1</version> 
</dependency> 

在這種情況下,因爲google-api-client包含:

<groupId>com.google.guava</groupId> 
<artifactId>guava-jdk5</artifactId> 

作爲依賴項,它會影響selenium庫中的guava庫。

在這種情況下,錯誤是:

no instance(s) of type variable(s) V exist so that ExpectedCondition<> ...

method until in class org.openqa.selenium.support.ui.FluentWait cannot be applied to given types; required: java.util.function.Function found: org.openqa.selenium.support.ui.ExpectedCondition reason: cannot infer type-variable(s) V (argument mismatch; org.openqa.selenium.support.ui.ExpectedCondition cannot be converted to java.util.function.Function)