与implicitwait()的同步不起作用,为什么?

时间:2017-10-20 07:22:41

标签: java selenium selenium-webdriver

我尝试与selenium webdriver同步,而且某些内容无法使用implicitlyWait()。

我理解隐含的方式(...)是代码等待,直到该元素可用于最大时间

以下代码因错误而崩溃:

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

System.out正在打印: - >> false true false(isDiplayed(),isEnabled(),是Selected())

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没有重复。

1 个答案:

答案 0 :(得分: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

  

隐式等待是告诉WebDriver对DOM进行轮询   尝试查找一个或多个元素的时间量   没有立即可用。默认设置为0.一旦设置,   隐式等待是为WebDriver对象实例的生命周期设置的。

这意味着,在您的示例中,selenium找到了元素,但它还没有"可点击"。

您也可以在测试中看到这一点。如果你看一下:

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

失败时,输出为:

-->> false true false

当它工作时:

-->> true true false