【问题标题】:org.openqa.selenium.TimeoutException: Expected condition failed: waiting for visibility of element located by By.xpath:org.openqa.selenium.TimeoutException:预期条件失败:等待 By.xpath 定位的元素的可见性:
【发布时间】:2019-08-03 05:07:34
【问题描述】:

我正在尝试使用sendkeys() 选项发送文本。这是我的类页面对象中的方法案例:

public void setEntityName() {
    internalWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"entity_name\"]")));
    entityName.clear();
    entityName.sendKeys("TEST");
}

HTML:

 <input id="entity_name" name="entity_name" type="text" ng-model="entityData.name" ng-disabled="false" placeholder="Type Enity Name" data-maxlength="20" data-smart-validate-input="" data-required="" class="ng-pristine ng-invalid ng-invalid-required ng-valid-maxlength ng-touched">

测试显示错误

org.openqa.selenium.TimeoutException: Expected condition failed: waiting for visibility of element located by By.xpath: //*[@id="entity_name"] 

谁能帮我解决这个错误。

【问题讨论】:

  • 错误意味着它所说的......它在等待元素变得可见时超时。这意味着元素(可能)永远不会变得可见,或者页面加载非常缓慢并且在超时期限内没有变得可见。我们不能说是哪一个,因为我们无权访问该页面或任何更多信息。我的猜测是您选择了一个永远不会可见的元素,可能是因为定位器匹配两个元素,一个用于桌面,另一个用于移动元素,其中移动元素首先出现,因此与您的定位器匹配,但永远不会显示在桌面上。
  • 一个建议...如果您有一个只查找 id 的定位器,请使用 By.id()。它比By.xpath()得到更好的支持和更快的支持。
  • 如果我看到错误内容,但我想知道他们是否有任何建议,我已经使用了 By id,当我进行手动测试时,我可以在输入中写入,我可以也点击它,但它不允许我使用不可见元素的sendKeys。

标签: java selenium-webdriver xpath css-selectors webdriverwait


【解决方案1】:

所需元素是Angular 元素,因此要调用sendKeys() 而不是visibilityOfElementLocated(),您必须为elementToBeClickable() 诱导WebDriverWait,您可以使用以下任一解决方案:

  • 使用cssSelector

    public void setEntityName() {
        WebElement entityName = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("input.ng-pristine.ng-invalid.ng-invalid-required.ng-valid-maxlength.ng-touched#entity_name[ng-model='entityData.name']")));
        entityName.clear();
        entityName.sendKeys("TEST");
    }
    
  • 使用xpath

    public void setEntityName() {
        WebElement entityName = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@class='ng-pristine ng-invalid ng-invalid-required ng-valid-maxlength ng-touched' and @id='entity_name'][@ng-model='entityData.name']")));
        entityName.clear();
        entityName.sendKeys("TEST");
    }
    

【讨论】:

  • 是否在等待元素可点击而不是可见 Angular 特有的东西?
  • @MateMrše 拇指规则,如果您的下一步是调用click()sendKeys(),则跨浏览器的唯一ExpectedConditions elementToBeClickable 因为visibility 不保证可点击性
  • @DebanjanB,非常感谢,正如他告诉我的那样。谢谢!!
猜你喜欢
  • 2018-09-18
  • 2021-01-03
  • 2019-04-20
  • 2017-10-17
  • 2020-10-30
  • 2019-11-25
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多