【问题标题】:Make Selenium find checkbox with disabled="disabled"使用 disabled="disabled" 使 Selenium 查找复选框
【发布时间】:2016-10-23 06:54:14
【问题描述】:

我正在尝试使用 disabled="disabled" 属性获取一个复选框:

 List<WebElement> checkBox= driver.findElements(By.xpath("xpath")); 

其中“xPath”是以下之一:

(.//*[contains(@class,'wfm-statusbar')])[1]/descendant::input

(.//*[contains(@class,'wfm-statusbar')])[1]/descendant::*[@type='checkbox']

(.//*[contains(@class,'wfm-statusbar')])[1]/descendant::*[@disabled='disabled']
在 FirePath 和 Console 中检查时,

所有上述工作。示例证明:

但是,当我在代码中运行 xPath 时,它会失败:

org.openqa.selenium.TimeoutException: Timed out after 15 seconds waiting for ...

如果我搜索“正常”复选框(没有 disabled 属性并且在同一页面上),代码可以工作。所以我很确定应该归咎于这个disabled="disabled" 属性。

简化的 HTML:

<div class="wfm-statusbar">
  <div>
    <span>  some text</span>
    <span>
    <label>
           <input type="checkbox"  disabled="disabled" >
    </label>
</span>
  </div>
</div>

有什么建议吗? 谢谢。

【问题讨论】:

  • 请解释“它失败了”!
  • 已编辑(添加例外)
  • 您尝试过更长的等待时间吗?
  • @SiKing - 我没有,因为我发现 15 秒是找到元素的充足时间。除了这种情况外,所有其他元素都会立即找到。感谢您的建议。
  • 您将不得不发布更多信息! “禁用”表明该元素是......禁用。 Selenium 通常不允许与禁用的元素交互。你想点击它吗?您是否以某种方式强制启用它?

标签: selenium xpath checkbox selenium-webdriver webdriver


【解决方案1】:

这应该有效,并且只有当它是一个复选框并且被禁用时才会获得该复选框。

(.//*[contains(@class,'wfm-statusbar')])[1]/descendant::*[@type='checkbox' and @disabled='disabled']

【讨论】:

  • 没有理由让它工作,因为它只是将两个不工作的选择器组合成一个。 p.s.反正我试过了,还是不行。
  • 您说当您在 firepath 中分别检查两个选择器时,它们都有效。您可以尝试使用WebDriverWait wait = new WebDriverWait(driver, 10);,然后使用WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.XPATH("the xpath you are testing")));,看看它是否可见。
【解决方案2】:

您可以尝试使用 CSS 选择器,但如果您的 XPath 不支持,我认为它不会起作用。正如 SiKing 所说,Selenium 不会与禁用或不可见元素交互。

System.out.println(driver.findElements(By.cssSelector("div.wfm-statusbar input[disabled='disabled']")).isEmpty());

如果没有找到任何元素,这将返回 true

您可能必须使用 JS 访问这些元素。您可以在此处找到与此相关的问题:How to use JavaScript with Selenium WebDriver Java

您将希望使用相同的 CSS 选择器,但使用 JS,如下所示。

document.querySelectorAll("div.wfm-statusbar input[disabled='disabled']");

这将返回您可以使用的元素集合。


这里有一个简单的例子,类似于您想要用于JavascriptExecutor 的东西。

WebDriver driver = new FirefoxDriver();
driver.get("https://www.google.com");
JavascriptExecutor jse = (JavascriptExecutor) driver;
List<WebElement> linksJs = (List<WebElement>) jse.executeScript("return document.querySelectorAll('a')");
System.out.println(linksJs.size());

【讨论】:

  • +1。感谢 JavaScript 的建议。当我收到java.lang.ClassCastException: [bla bla] ... cannot be cast to org.openqa.selenium.JavascriptExecutor 时无法运行 JS 脚本。我已经解决了这个问题,但没有成功。如果我让它工作,我会回到这个答案。
  • 我添加了一个 JSE 的简单示例以及在这种情况下您可能会如何使用它。
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多