Java org.openqa.selenium.TimeoutException:预期条件失败:正在等待by.xpath定位的元素的可见性:

Java org.openqa.selenium.TimeoutException:预期条件失败:正在等待by.xpath定位的元素的可见性:,java,selenium-webdriver,xpath,css-selectors,webdriverwait,Java,Selenium Webdriver,Xpath,Css Selectors,Webdriverwait,我正在尝试使用选项sendkeys()发送文本。这是我的类页面对象中的方法案例: public void setEntityName() { internalWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"entity_name\"]"))); entityName.clear(); entityName.sendKeys("TEST"); } HTML: 所需的

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

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

所需的元素是一个元素,因此要调用
sendKeys()
而不是
元素的可见性()
,您必须将
元素的WebDriverWait诱导为可禁用()
,并且您可以使用以下任一解决方案:

  • 使用
    css选择器

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

错误意味着它所说的。。。它在等待元素可见时超时。这意味着要么元素(可能)永远不会可见,要么页面加载速度非常慢,在超时时间内不可见。我们无法说出它是哪一个,因为我们无法访问该页面或任何其他信息。我猜您选择了一个永远不会显示的元素,可能是因为定位器匹配两个元素,一个用于桌面,另一个用于移动,其中移动元素位于第一位,因此匹配您的定位器,但不会显示在桌面上。建议。。。如果定位器只查找id,请使用
By.id()
。它比.xpath()提供的
支持更好,速度更快。如果我看到了错误,但我想知道他们是否有任何建议,我已经使用了By id,当我进行手动测试时,我可以在输入中写入,我也可以单击它,但它不允许我使用sendKeys元素不可见。是否正在等待元素可单击而不是可见?Angular?MateMrše拇指规则,如果下一步是调用
click()
sendKeys()
跨浏览器的唯一预期条件是
元素可折叠
,因为
可见性
不能保证clickability@DebanjanB,非常感谢,正如他告诉我的。谢谢!!