Explict等待不能一致地工作,失败给出错误其他元素正在接收点击

时间:2016-11-07 10:41:57

标签: java selenium

我正在使用页面对象模型

我的Firefox版本是47.01,Selenium Server版本是2.53.1

我在执行testNG时遇到错误:

  

失败:startTest org.openqa.selenium.WebDriverException:元素是   点(1258,50)无法点击。其他元素会收到   单击:命令持续时间或超时:79   毫秒

以下是我已尝试过的内容:

  1. 等待出错的元素。 结果:等待仍然失败。
  2. 提供断点和调试。 结果:相同的代码绝对正常,在调试模式下没有错误。
  3. 尝试过Implict等待。 结果:同样,在调试模式下正常工作时执行失败。
  4. 我的等待代码在Test_Base类中,声明了wait:

    public void waitForElement(Wait<WebDriver> wait){
    
        System.out.println("#####Insidewait");
    
        if(wait == null){
        //this.wait = new WebDriverWait(myBrowser, 20);
    
            this.wait = new FluentWait<WebDriver>(myBrowser)
                    //Timeout time is set to 20
                    .withTimeout(20, TimeUnit.SECONDS)
                    // polling interval
                    .pollingEvery(500, TimeUnit.MILLISECONDS)
                    //ignore the exception
                    .ignoring(NoSuchElementException.class, ElementNotVisibleException.class);
        }
    }
    

    Test_Script001类扩展了Test_Base类,其中使用了wait对象:

    By upgrade = By.xpath("//a[text()='Upgrade']");
    By loader = By.xpath("//div[@id='dashBoardLoader'and contains(@style,'display: block')]");
    By logout = By.xpath("//a[text() = 'Logout']");
    Home home = null;
    LogIN login = null;@Test
    public void startTest() throws Exception {
    
        login.loginToApplication(repository.getProperty("username"), repository.getProperty("password"));
        wait.until(ExpectedConditions.invisibilityOfElementLocated(loader));
        wait.until(ExpectedConditions.visibilityOfElementLocated(upgrade)).isDisplayed();
        WebElement btnUpgrade = myBrowser.findElement(upgrade);
        if(btnUpgrade.isDisplayed()){
            //myBrowser.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            home.ClickOnLogout();
            wait.until(ExpectedConditions.urlContains(logoutURL));
            System.out.println("Clicked on logout successfully..");
        }
        else
            System.out.println("Unable to click on logout.");
    }
    

3 个答案:

答案 0 :(得分:0)

这可能是一个时间问题。期望ExpectedConditions.visibilityOfElementLocated并不真正等待可见性。它等待元素以正大小和不透明度显示,但该元素仍然可以被另一个元素覆盖。

要解决此问题,您可以重试点击直至成功:

new WebDriverWait(driver, 6).until((WebDriver drv) -> {
    try {
        element.click();
        return true;
    } catch (WebDriverException ex) {
        return false;
    }
});

如果元素显示有一些过渡效果,您也可以尝试等待特定大小:

// wait minimum width / height
new WebDriverWait(driver, 6).until((WebDriver drv) -> {
    Dimension size = element.getSize();
    return size.getWidth() > 15 && size.getHeight() > 15 ? element : null;
}).click();

答案 1 :(得分:0)

我已多次遇到这种情况。通常在关闭具有模态(灰色)背景但没有足够快地关闭的对话框之后,等等。我做的是将一对夫妇等在一起,我等待模态背景(或其他)不可见然后等待元素可点击/可见。

错误消息应告诉您哪个元素会收到点击...那就是您要等待隐身的元素。

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator)); // blocking element
wait.until(ExpectedConditions.elementToBeClickable(locator)).click(); // desired element

答案 2 :(得分:0)

所有,非常感谢你的帮助..

我的应用程序具有从DOM上的服务器呈现的控件,但是使用CSS属性(例如display:block和display:none)在客户端控制元素的可见性。

我使用的函数用于检查DOM中存在的元素(服务器呈现),因此等待返回true并且同步失败;虽然我假设等待失败了!

使用客户端属性的函数

解决了等待时间问题

ExpectedConditions.attributeToBe(定位器,属性,值);

而不是

wait.until(ExpectedConditions.invisibilityOfElementLocated(元件));

wait.until(ExpectedConditions.visibilityOfElementLocated(元件))isDisplayed();

wait.until(ExpectedConditions.presenceofElement(元件))isDisplayed();

<强>使用

ExpectedConditions.attributeToBe(locator,attribute,value);