2017-10-20 11 views
1

私はselenium webdriverとの同期を試みていますが、何かがimplicitlyWait()で動作していません。implicitwait()との同期が機能しません、なぜですか?

私はimplicitlyWait(..)を理解する方法は、要素が時間の最大のために利用可能になるまでのコードはを待っていることです。

エラーでクラッシュし、以下のコード:

org.openqa.selenium.InvalidElementStateException: invalid element state: Element is not currently interactable and may not be manipulated 

のSystem.out IST印刷: - >>偽真偽(isDiplayed()、ISENABLED()、選択された())

private static WebDriver driver;  
public static void main(String[] args) throws InterruptedException { 
     setupWebDriverChrome(); 
     //Thread.sleep(1000); 
     final String cssSelectorFromAirport = "div.od-airportselector.airportselector_root input[tabindex='11']"; 
     final By cssSelector = By.cssSelector(cssSelectorFromAirport); 
     WebElement fromAirportElement = driver.findElement(cssSelector); 
     System.out.println("-->> " + fromAirportElement.isDisplayed() + " " + fromAirportElement.isEnabled() + " " + fromAirportElement.isSelected());  
     fromAirportElement.clear(); 
     fromAirportElement.sendKeys("MUC"); 
    } 

    private static void setupWebDriverChrome() { 
     System.setProperty("webdriver.chrome.driver", "C:\\...\\chromedriver.exe"); 
     setupLocation(); 
    } 
    private static void setupLocation() { 
     driver.manage().timeouts().implicitlyWait(1000, TimeUnit.MILLISECONDS);  
     driver.get("https://www.opodo.de/"); 
    } 

私はGeckodriverでも同じ結果を試しました。

待機時間も増やしましたが、同じ結果が得られました。

それが機能するようにする唯一の方法は、のThread.sleep()(上記のコメント)

EDIT Plsのを使用することです。 Selenium implicitwait not workingと重複はありません。

+0

を私はスレッドを見ヨール意味しているが、私は重複は見ません。あなたが重複plsを意味する場合。理由を説明してください – ken

答えて

2

あなたの要素がクリック可能であるのを待たなければなりません。 documentationから

setupWebDriverChrome(); 
    //Thread.sleep(1000); 
    final String cssSelectorFromAirport = "div.od-airportselector.airportselector_root input[tabindex='11']"; 
    WebElement element = (new WebDriverWait(driver, 10)) 
      .until(ExpectedConditions.elementToBeClickable(By.cssSelector(cssSelectorFromAirport))); 
    /*final By cssSelector = By.cssSelector(cssSelectorFromAirport); 
    WebElement fromAirportElement = driver.findElement(cssSelector); 
    System.out.println("-->> " + fromAirportElement.isDisplayed() + " " + fromAirportElement.isEnabled() + " " + fromAirportElement.isSelected());*/ 
    element.clear(); 
    element.sendKeys("MUC"); 

EDIT

WebElement element = (new WebDriverWait(driver, 10)) 
       .until(ExpectedConditions.elementToBeClickable(By.cssSelector(cssSelectorFromAirport))); 

だから、これを追加してみてください

An implicit wait is to tell WebDriver to poll the DOM for a certain amount of time when trying to find an element or elements if they are not immediately available. The default setting is 0. Once set, the implicit wait is set for the life of the WebDriver object instance.

このことは、あなたの例では、セレンは、要素を見つけましたまだ「クリック可能」ではありません。

これはあなたのテストでも見ることができます。あなたが見てみる場合:

System.out.println("-->> " + fromAirportElement.isDisplayed() + " " + fromAirportElement.isEnabled() + " " + fromAirportElement.isSelected()); 

それが失敗した場合、出力は次のようになります。

-->> false true false 

それが動作するときながら:Janith1024 @

-->> true true false 
+0

ありがとう、なぜ、要素がクリック可能になるまで暗黙的に待機していますか? – ken

+0

@ken私はちょうどその答えを編集しました。 –

+1

ベストプラクティスである 'WebDriverWait'を使うつもりならば、暗黙の待ちを使わないようにしてください。これは、[公式ドキュメント](http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits)に警告されています。警告:暗黙的および明示的な待機を混同しないでください。そうすると、予測できない待ち時間が発生する可能性があります。 – JeffC

関連する問題