selenium元素定位不到问题分析及解决办法

最近正在学习写自动化测试脚本,遇到一个错误迟迟未解决,导致自信心大受挫败,甚至想放弃。

思考许久突然想到,我遇到的问题是否也有人会遇到,如果有的话问题就应该有解决办法了。没什么问题是百度解决不了的,如果不行那就谷歌。

终于有了前辈们的指引,问题解决了,瞬间信心十足,又有了学习的动力。

下面是遇到的错误提示:定位不到元素

Traceback (most recent call last):
File "cs.py", line 26, in test_GIS
self.driver.find_element_by_xpath('//*[@id="app"]/div/div[1]/div[1]/div/ul/li[2]').click()#点击GIS地图
File "F:\python3.7\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
self._execute(Command.CLICK_ELEMENT)
File "F:\python3.7\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "F:\python3.7\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "F:\python3.7\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <li class="ivu-menu-item">...</li> is not clickable at point (33, 209). Other element would receive the click: <i class="ivu-icon ivu-icon-ios-warning"></i>
(Session info: chrome=78.0.3904.97)

1)原因分析和解决办法: 在定位元素时,页面元素未加载完成

在定位元素前面添加休眠时间,原因是页面未加载完全,无法识别操作后的元素。刚开始一直以为是元素定位的不对,但我通过CMD命令窗口一行一行的运行检查发现并没有出现报错。

直接在元素定位前面添加休眠时间,结果成功运行。

2)原因分析和解决办法: 表单嵌套原因

顺着定位元素往上找,查看是否有<iframe>标签,找到说明要定位此元素,需先切换到此表单,在定位元素。

 

 

 需使用switch_to_frame("name值")switch_to_frame("id值")   ,若该iframe没有id或name值,先定位到iframe,再将定位对象传到
switch_to_frame

1 driver = webdriver.Chrome()
2 driver.switch_to_frame("name值")

3)原因分析和解决办法: 元素未达到可见条件

如下,需要鼠标悬停才能定位的,否则不可见无法定位。

需达到前置条件后才可定位。

 

 

4)原因分析和解决办法:  打开了新的窗口

需要查找的元素在打开的新的窗口 (注意有时候打开新的窗口后,原窗口会关闭)需切换到新窗口才能定位。

切换到新窗口方法:

1 #获得新打开窗口的句柄
2 handle = self.driver.current_window_handle
3 #获得全部窗口句柄
4 handles = self.driver.window_handles
5 #切换到新窗口
6 for newhandles in handles:
7     if newhandles != handle:
8          self.driver.switch_to_window(newhandles)

5)原因分析和解决办法:定位方式不唯一,或者没有该元素

检查该元素是否可定位,可通过F12的console标签通过document.querySelector() 的方法定位,可验证是否能找到元素

 

 

 如果通过以上检查验证没有问题但是运行时依然定位不到,可以考虑其他语法或者加多层逻辑关系,如下检查没有问题,但是运行一直报错定位不到元素

 

报错代码:

self.driver.find_element_by_css_selector("body > div:nth-child(22) > div.ivu-modal-wrap.modal-vertical-center > div > div > div.ivu-modal-body > div:nth-child(2) > button > span").click()

改成以下的定位方式就成功运行了,楼主百思不得其解。。

 

self.driver.find_element_by_xpath("//div[@style='width: 650px;']/div/div[2]/div[2]/button/span").click()

posted @ 2019-12-15 19:01  Harry_666  阅读(2267)  评论(0编辑  收藏  举报