如何检查硒是否可以单击100%覆盖的WebElement

时间:2018-07-31 14:14:53

标签: java selenium selenium-webdriver webdriver webdriverwait

我有两个绝对位置的div

<div id="4711" style="position:absolute;top:0px;bottom:0px;left:0px;right:0px;background-color:red">Visible later</div>
<div id="4712" style="position:absolute;top:0px;bottom:0px;left:0px;right:0px;background-color:green">To be removed</div>

和一些Javascript(此处未显示),可在一段时间(例如2秒后)从DOM中删除4712。

现在,在我的Selenium测试中,我想检查4711是否可单击。 从用户的角度来看,只有在删除4712之后才能单击它。

所以我尝试了

new WebDriverWait(browserInstance.getWebDriver(), 5).until(ExpectedConditions.elementToBeClickable(By.id("4711")));

但是,即使在删除4712之前,4711始终是可单击的(启用= true,显示= true)。

有什么方法可以检查4711是否真的可点击,即从用户的角度来看是可点击的(理想情况下不使用Javascript)?

2 个答案:

答案 0 :(得分:0)

您是否尝试过等待4712的隐身性,然后再检查4711的可单击性。4711在4712仍可见时仍可能注册为可单击状态,这可能是导致问题的原因。

new WebDriverWait(browserInstance.getWebDriver(), 5).until(!ExpectedConditions.elementToBeVisible(By.id("4712")));
new WebDriverWait(browserInstance.getWebDriver(), 5).until(ExpectedConditions.elementToBeClickable(By.id("4711")));

答案 1 :(得分:0)

正如您所提到的, Javascript 删除了元素 4712 ,目前尚不清楚元素变为陈旧还是变为不可见。因此,对于此步骤,您可以使用以下任一选项:

  • stalenessOf()

    new WebDriverWait(browserInstance.getWebDriver(), 5).until(ExpectedConditions.stalenessOf(driver.findElement(By.id("4712"))));
    
  • invisibilityOfElementLocated()

    new WebDriverWait(browserInstance.getWebDriver(), 5).until(ExpectedConditions.invisibilityOfElementLocated(By.id("4712")));
    
  • notvisibilityOfElementLocated()

    new WebDriverWait(browserInstance.getWebDriver(), 5).until(ExpectedConditions.not(ExpectedConditions.visibilityOfElementLocated(By.id("4712"))));
    
  • notpresenceOfElementLocated()

    new WebDriverWait(browserInstance.getWebDriver(), 5).until(ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(By.id("4712"))));
    

下一步,您要验证元素 4711 是否可单击,可以使用以下代码行:

new WebDriverWait(browserInstance.getWebDriver(), 5).until(ExpectedConditions.elementToBeClickable(By.id("4711")));

注意:元素的状态为 enabled=true displayed=true 并不等同于元素 interactable ,即 clickable