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

xiaoli · 发布于 2017年01月10日 · 最后由 NJ-zero 回复于 2017年02月13日 · 1127 次阅读

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

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 条回复
5338

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

3474

#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();

}
可以了,,谢谢

3474
xiaoli · #3 · 2017年01月11日 作者

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

10132

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

96

可以用 is_displayed() 方法

3474
xiaoli · #6 · 2017年01月12日 作者

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

3474
xiaoli · #7 · 2017年01月12日 作者

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

4503

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

5338

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

10132

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

8447

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

3474
xiaoli · #12 · 2017年01月16日 作者

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

3474
xiaoli · #13 · 2017年01月16日 作者

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

8447

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

3474
xiaoli · #15 · 2017年01月16日 作者

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

8447

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

8447

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

3474
xiaoli · #19 · 2017年02月06日 作者

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

8447

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

7f572b

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

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