2017-10-20 52 views
1

我想與硒webdriver同步和東西不隱式地處理()。與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()(以上評論)

編輯 PLS。請注意,我沒有看到與Selenium implicitwait not working重複。

+0

@ Janith1024我所見過的線程侑意思,但我沒有看到任何重複。如果你的意思是有重複請求。解釋爲什麼 – ken

回答

2

您必須等待您的元素可點擊。嘗試添加此:

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

所以:

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

編輯

documentation

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 

而當它的工作原理:

-->> true true false 
+0

謝謝,但爲什麼隱式地Wait()不等,直到元素可點擊? – ken

+0

@ken我剛剛編輯了答案。 –

+1

如果你打算使用'WebDriverWait',這是一個最佳實踐,只要確保你沒有使用隱式等待。這在[官方文檔](http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits)中受到警告。 '警告:不要混合隱式和顯式等待。這樣做會導致無法預測的等待時間 – JeffC