如何强制Selenium WebDriver单击目前不可见的元素?
我使用FirefoxDriver使用Selenium 2 Java API。 当我填写表格时,根据表单input,checkbox被添加到页面中。
我想用Selenium模拟点击这些checkbox。 该元素在常规浏览器中可见并可用,但是,selenium声明元素不可见。
"Element is not currently visible and so may not be interacted with"
我可以强迫selenium忽略元素的不可见状态吗? 我如何强制Selenium与不可见元素进行交互?
Selenium根据以下标准确定一个元素是否可见(使用DOM检查器确定css应用于元素的情况,确保查看计算的样式):
- 能见度!=隐藏
- display!= none(也针对每个父元素进行检查)
- 不透明度!= 0(这不会被检查点击一个元素)
- 高度和宽度都是> 0
- 对于input,属性types!= hidden
你的元素是匹配其中的一个标准。 如果你没有能力去改变元素的样式,那么你可以用JavaScript来强制执行它(假设你使用Selenium2 API,假定使用WebDriver):
((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);
但是,这不会触发一个JavaScript事件,如果你依赖于该input的变化事件,你也必须解雇(许多方法来做到这一点,最简单的使用任何JavaScript库加载在该页面上)。
能见度检查的来源 –
https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577
定义这个的WebDriver规范 –
有时候,这意味着页面上有多个元素具有相同的属性,而您正在尝试search相同的属性,并且“正在与错误的对话”。
如果你的元素不能唯一标识:id或:name(或:class),这可能会很棘手。
有时通过:xpathsearch元素将有所帮助,在某些情况下甚至是不切实际的。
在这种情况下,您可能必须获得符合条件的所有元素,并通过索引引用正确的元素。 这是肮脏的,但它的作品。
我从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
希望这可以帮助。
我有一个类似的问题,但是它与元素在视口中不可见有关。 我做了一个截图,意识到浏览器窗口太窄,元素无法看到。 我做了其中的一个,它的工作:
driver.maximize_window()
请参阅: WebDriver.maximize_window()
还有另外一种情况,可见元素将被识别为不可见:
- 当元素被CSS转换时
- 当元素的父元素被CSS转换时
为了检查你想与之交互的元素是否被CSS转换,在CHROME上执行以下操作:
- 开放检查员
- find有趣的元素(或更可能是其父元素,应该是div元素)
- select“计算”选项卡
- 如果有一个参数:webkit-transform:matrix(…),这意味着元素是CSS转换的,可能不被selenium 2识别为可见元素
不可见性也可能是由于元素应该慢慢出现的时间。 在这种情况下,强制浏览器稍微等一下可能会有所帮助。
看看,例如让WebDriver等待一个元素出现的问题 。
或者您可以使用Selenium Action Class来模拟用户交互 – 例如
WebDriver = new FirefoxDriver(); WebElement menu = driver.findElement(By.xpath("")); // the triger event element Actions build = new Actions(driver); // heare you state ActionBuider build.moveToElement(menu).build().perform(); // Here you perform hover mouse over the needed elemnt to triger the visibility of the hidden WebElement m2m= driver.findElement(By.xpath(""));//the previous non visible element m2m.click();
我在Internet Explorer 9中遇到了与selenium2相同的问题,但我的修复程序非常奇怪。 我无法点击我的表单中的input – >selenium重复,他们不可见。
它发生在我的表单有弯曲的阴影时 – > http://www.paulund.co.uk/creating-different-css3-box-shadows-effects :在具体的“效果2号”
我不知道,为什么这个伪元素解决scheme停止seleniumtesting,但它对我有用。
我只是解决这个错误,而在ror项目中使用水豚通过添加:
Capybara.ignore_elements = true
到features/support/env.rb
您不能强制访问/更改用户通常无法访问的元素,因为Selenium旨在模拟用户交互。
如果发生此错误,请检查:
- 元素在你的视口中是可见的,试着最大化webdriver正在使用的当前窗口(例如,Python中的node.js ,
maximize_window()
中的maximize_window()
), - 你的元素不会出现两次(在同一个select器下),而你select了错误的元素,
- 如果你的元素是隐藏的,那么考虑使其可见,
- 如果你想访问/更改隐藏元素的值,尽pipe有限制,那么使用Javascript(例如node.js中的
executeScript()
execute_script()
,Python中的execute_script()
)。
我只是通过等待元素显示属性来解决这个错误
waitFor() { element.displayed }
接受的答案为我工作。 下面是一些代码来find使Selenium认为它不可见的父元素。
function getStyles(element){ computedStyle = window.getComputedStyle(element); if(computedStyle.opacity === 0 || computedStyle.display === "none" || computedStyle.visibility === "hidden" || (computedStyle.height < 0 && computedStyle.height < 0) || element.type === "hidden") { console.log("Found an element that Selenium will consider to not be visible") console.log(element); console.log("opacity: " + computedStyle.opacity); console.log("display: " + computedStyle.display); console.log("visibility: " + computedStyle.visibility); console.log("height: " + computedStyle.height); console.log("width: " + computedStyle.width); } if(element.parentElement){ getStyles(element.parentElement); } } getStyles(document.getElementById('REPLACE WITH THE ID OF THE ELEMENT YOU THINK IS VISIBLE BUT SELENIUM CAN NOT FIND'));
- java.util.Date和XMLGregorianCalendar之间的简单转换
- 如何使用java套接字实现客户端和服务器之间的传输文件
- Java的Thread.sleep何时抛出InterruptedException?
- 避免Java中的“instanceof”
- 如何在Java中使用sudo权限执行bash命令?
- java.security.InvalidAlgorithmParameterException:在Linux上,trustAnchors参数必须是非空的,或者为什么默认信任库是空的
- 基于Linux OpenJDK Debian的发行版的JAVA_HOME环境variables的正确目标是什么?
- java:使用StringBuilder在开头插入
- Android buildscript存储库:jcenter VS mavencentral