![](/img/trans.png)
[英]Selenium Webdriver: Element is not currently visible on running through Jenkins
[英]How to force Selenium WebDriver to click on element which is not currently visible?
我正在使用Selenium 2 Java API和FirefoxDriver。 填写表单时,根据表单输入将复选框添加到页面中。
我想使用Selenium模拟这些复选框的点击。 该元素在常规浏览器中可见并可用,但selenium断言元素不可见。
"Element is not currently visible and so may not be interacted with"
我可以强制硒忽略元素的不可见状态吗? 如何强制Selenium与不可见元素进行交互?
Selenium通过以下标准确定元素是否可见(使用DOM检查器确定哪些css适用于您的元素,请确保查看计算样式):
您的元素符合其中一个条件。 如果你没有能力改变元素的样式,那么你可以通过javascript强制执行它(自从你说Selenium2 API后就假设WebDriver):
((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);
但这不会触发javascript事件,如果您依赖于该输入的更改事件,您也必须触发它(许多方法都可以这样做,最容易使用该页面上加载的任何javascript库)。
能见度检查的来源 -
https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577
WebDriver规范定义了这个 -
有时这意味着页面上有多个元素具有您尝试搜索的相同属性,并且您“正在与错误的对话”。
如果您的元素不能通过: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
希望这可以帮助。
我遇到了类似的问题,但它与视口中不可见的元素有关。 我拍了一张截图,发现浏览器窗口太窄,无法看到元素。 我做了其中一个并且它有效:
driver.maximize_window()
或者您可以使用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();
还有另一种情况,可见元素将被识别为不可见:
为了检查你不想与之交互的元素是否已经转换了CSS,在CHROME上执行以下操作:
不可见性也可能是由于元素应该缓慢出现的时间。 在这种情况下,强制浏览器稍稍等待可能会有所帮助。
例如,请参阅让WebDriver等到元素存在的问题 。
我在Internet Explorer 9中遇到了与selenium 2相同的问题,但我的修复很奇怪。 我无法点击我的表单中的输入 - >硒重复,它们是不可见的。
它发生在我的形状有弯曲的阴影时 - > http://www.paulund.co.uk/creating-different-css3-box-shadows-effects :在具体的“效果2号”中
我不知道,为什么以及这个伪元素解决方案如何停止硒测试,但它对我有用。
您无法强制访问/更改用户通常无法访问的元素,因为Selenium旨在模仿用户交互。
如果发生此错误,请检查是否:
maximize()
中的Node.js, maximize_window()
在Python) executeScript()
execute_script()
,Python中的execute_script()
)。 我只是通过等待元素显示属性来解决这个错误
waitFor() { element.displayed }
我使用selenium在django站点上进行功能测试,使用bootstrap glyphicons作为模板中的链接进入ElementNotVisibleException异常:
<a href="{% url 'item-add' %}"><span class="glyphicon glyphicon-plus text-danger"></span></a>
在我的功能测试期间,未加载引导样式,然后尝试单击此类链接将引发ElementNotVisibleException。 我设法让它们可点击, 只需在标签中添加一个空格 ,就像这样:
<a href="{% url 'item-add' %}"><span class="glyphicon glyphicon-plus text-danger"> </span></a>
我只是通过添加以下内容在ror项目中使用capybara时解决了这个错误:
Capybara.ignore_elements = true
to features/support/env.rb
接受的答案对我有用。 下面是一些代码,用于查找使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'));
要在这里添加我的沙粒:如果元素位于固定div后面,它将被视为不可见,您将无法单击它; 这最近发生在我身上,我解决了它执行上面推荐的脚本,它确实:
document.evaluate("<xpath locator for element to be clicked>", document, null, XPathResult.ANY_TYPE, null).iterateNext().click()", locator);
这个页面上有很多好的答案。
两者都在上面的各种细节中讨论。 我没有看到的答案是ScrollToElement。 听起来你正在处理一个元素列表,而处理你正在创建更多的元素,复选框。 这可能导致列表中的元素移出可见页面。 有时您可以用肉眼看到元素,但您无法点击它。 处理列表时,有时必须插入滚动。
因为我遇到了这个,我创建了一个PageScroll.java并将我的滚动脚本放在那里。 以下是此类中的一些方法:
public static void scrollToTop(WebDriver driver) {
((JavascriptExecutor) driver)
.executeScript("window.scrollTo(0,0)");
}
public static void scrollToBottom(WebDriver driver) {
((JavascriptExecutor) driver)
.executeScript("window.scrollTo(0, document.body.scrollHeight)");
}
public static void scrollToElementTop(WebDriver driver, WebElement element) {
((JavascriptExecutor) driver).executeScript(
"arguments[0].scrollIntoView(true);", element);
}
public static void scrollToElementBottom(WebDriver driver, WebElement element) {
((JavascriptExecutor) driver).executeScript(
"arguments[0].scrollIntoView(false);", element);
}
有关更多示例,请参阅使用Selenium将元素滚动到视图中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.