Selenium [求助] 如何判断某元素是否在当前视图内

周小丽 · 2017年01月10日 · 2809 次阅读

比如有些元素在底部,需要拖动滚动条才能看到,那么问题是如何判断该元素是否在当前视图内?如果不在,才拖动滚动条查找,不知道那判断语句怎么写,请大神帮忙指导下,谢谢

wait.until(ExpectedConditions.elementToBeClickable(webElement)).isEnabled(); ---->打印为true备注不管该元素是否在当前视图内只要能找到该元素打印结果都是true

webElement.isDisplayed() ---->打印结果是true备注不管该元素是否在当前视图内只要能找到该元素打印结果都是true

但webElement.click(); 运行报错element is not clickable at point (513, 807). 

原因是webElement不在当前视图需要拖动滚动条就可见了因此添加一条语句
 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", webElement);------>就可以正常click了

但问题来了若该元素在当前视图执行 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", webElement);后会滚动页面导致找不到那元素了因此也报错element is not clickable at point 

那么我想写一个判断语句,判断该元素是否在当前视图内?

共收到 21 条回复 时间 点赞

捕获一下异常,例如:
try:
element.cick()
catch:
拖动滚动条。
点击。

#1 楼 @tongshanshanshan
try{
loginBtn.click();
}
catch(WebDriverException e){
String s = e.getMessage();
if(s.contains("Element is not clickable at point"))
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", loginBtn);
loginBtn.click();

}
可以了,,谢谢

#1 楼 @tongshanshanshan 这是一种解决方法,可是感觉有些风险,可是就没有一个判断语句,是判断该元素是否在当前视图内的不?我百度了好多语句都不行

driver.getPageSource() 好像有这么个方法

可以用 is_displayed() 方法

#5 楼 @yyaosum is_displayed() 不可以,我试过在下拉滚动条最底端的,用 is_displayed() 显示为 true

#4 楼 @haifushi 这也不行,因为这元素是在同一个页面,只是在底端,下拉滚动条就可以看见元素了

#3 楼 @xiaoli 可以获取到该元素的坐标,再做判断。

#3 楼 @xiaoli
你是指判断某一特殊元素,还是希望有一个通用的解决办法?

#7 楼 @xiaoli o_o 要是有好的解决方案烦请科普下

element is not clickable at point 这个异常是有元素遮挡导致的。所以 js 可以执行,你滚动了后 click 执行也是不可以的。

#9 楼 @tongshanshanshan 通用的方法。就是如何判断某元素是否在当前视图内的判断语句不知道怎么写

#11 楼 @sophia_super 没有遮挡,拖动滚动条就可以看到了,js 拖动滚动条找到那元素后 click 是可以的,,,但问题是加了那 js 后,对于当前视图内的元素 也滚动了导致找不到那元素了

#13 楼 @xiaoli 有个 Element.scrollIntoViewIfNeeded() 可以支持元素如果不在可视区则滚动,如果存在则不滚动。

#14 楼 @sophia_super
((JavascriptExecutor) driver).executeScript("arguments[0].Element.scrollIntoViewIfNeeded(true);", loginBtn);
报错:unknown error: Cannot read property 'scrollIntoViewIfNeeded' of undefined

#15 楼 @xiaoli ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoViewIfNeeded(true);", loginBtn);

这个就是有元素遮挡了,要用 js 进行点击

#18 楼 @sophia_super 明白要用 js 进行点击,那怎么判断元素是否遮挡了呢?

#19 楼 @xiaoli 要先进行一次点击 捕获异常后,对异常进行分析,如果是 element is not clickable 这种异常就进行 js 点击,如果是其他异常导致的,则另外针对其他异常进行处理

匿名 #21 · 2017年02月13日

https://testerhome.com/topics/7382
我之前请教的类似的问题,应该可以借鉴一下

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册