如何强制硒WebDriver单击当前不可见的元素?

2022-08-31 10:13:58

我正在使用Selenium 2 Java API和FirefoxDriver。当我填写表单时,复选框会根据表单输入添加到页面。

我想使用Selenium模拟点击这些复选框。该元素在常规浏览器中是可见和可用的,但是,selenium断言这些元素不可见。

"Element is not currently visible and so may not be interacted with"

我可以强迫硒忽略元素的不可见状态吗?如何迫使硒与不可见的元素相互作用?


答案 1

Selenium通过以下标准确定元素是否可见(使用DOM检查器确定适用于您的元素的css,请确保您查看计算样式):

  • 可见性 != 隐藏
  • display != none(也会针对每个父元素进行检查)
  • 不透明度 != 0(单击元素时不检查此值)
  • 高度和宽度均> 0
  • 对于输入,属性类型 != 隐藏

您的元素符合这些条件之一。如果您无法更改元素的样式,那么您可以使用javascript强制执行此操作(假设WebDriver,因为您说的是Selenium2 API):

((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);

但这不会触发javascript事件,如果你依赖于该输入的更改事件,你也必须触发它(有很多方法可以做到这一点,最简单的方法是使用该页面上加载的任何javascript库)。

可见性检查的来源 -

https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577

定义此内容的 WebDriver 规范 -

https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#widl-WebElement-isDisplayed-boolean


答案 2

有时,这意味着页面上有多个元素具有您尝试搜索的相同属性,并且您“与错误的元素交谈”。

如果你的元素不能用 :id 或 :name(或 :class)唯一标识,那可能会很棘手。

有时通过 :xpath 搜索元素会有所帮助,在某些情况下,即使这样也不切实际。

在这些情况下,您可能必须获取与您的条件匹配的所有元素,并通过索引引用正确的元素。它很脏,但它有效。

我正在使用Ruby on Rails应用程序中的Selenium / Watir,所以在我的情况下,这个例子是:

browser = Watir::Browser.new(:firefox, :profile => "default")       
browser.goto("http://www.google.com/analytics")
# login
browser.divs(:text, "+ New Property").last.click

希望这有帮助。


推荐