您的位置:首页 > 其它

webdriver element not visible 的一种解决方法

2017-12-28 14:14 731 查看

org.openqa.selenium.ElementNotVisibleException: element not visible

加了等待时间后仍然报错,记录在使用过程中的处理方法,并最终运行正常

以下是html代码片断,是一个单选框,要定位的是input type=”checkbox”

<span class="ant-checkbox">
<input type="checkbox" class="ant-checkbox-input" value="on">
<span class="ant-checkbox-inner"></span>
</span>


正常情况下:

driver.findElements(By.className("ant-checkbox-input"))


但是报错了

org.openqa.selenium.ElementNotVisibleException: element not visible


尝试加等待时间并使用js点击:

JavascriptExecutor js = (JavascriptExecutor) driver;
WebElement checkbox = driver.findElement(By.className("ant-checkbox-input"));
js.executeScript("arguments[0].click();", checkbox);


结果:代码指行没有报错,但从页面上观察并未点击到,这个方法在此使用无法通过。

分析:可能在页面上存在多个相同属性的checkbox,在html里直接搜索classname的属性值,检查有多少个,使用谷歌浏览器,在console里输入document.getElementsByClassName(‘ant-checkbox-input’);,回车,显示如下:



以上说明含有相同属性的元素一共有13个。由此,可以确定,直接定位的时候并不是想要的那一个。

知道原因就好办了,有两种方法:

-# 找出目标是第几个,用list准确定位到目标元素。这种方法的缺点也显而易见,就是以后前端代码有改变,那么我需要重新定位在第几个

List<WebElement> checkboxs = driver.findElements(By.className("ant-checkbox-input"));
checkboxs.get(i).click();


-# 循环点击所有checkbox,正确点击后,停止。这种方法就可以避开顺序位改变后,我们不需要修改。缺点是需要确认第一次的点击就是我们需要目标元素

List<WebElement> checkboxs = driver.findElements(By.className("ant-checkbox-input"));
System.out.println("checkboxs num is " + checkboxs.size());
for(int i=0; i <checkboxs.size(); i++){
System.out.println(checkboxs.get(i).getAttribute("outerHTML"));
try {
checkboxs.get(i).click();
break;
} catch (ElementNotVisibleException e) {
continue;
}

}


我使用了第二种方法。我先从业务上做了筛选,使页面尽量少出现checkbox,并做到,第一次点击是我需要元素。

到此,解决了element not visible的问题,记录下来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐