zoukankan      html  css  js  c++  java
  • 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.7libsite-packagesseleniumwebdriver emotewebelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
    File "F:python3.7libsite-packagesseleniumwebdriver emotewebelement.py", line 633, in _execute
    return self._parent.execute(command, params)
    File "F:python3.7libsite-packagesseleniumwebdriver emotewebdriver.py", line 321, in execute
    self.error_handler.check_response(response)
    File "F:python3.7libsite-packagesseleniumwebdriver emoteerrorhandler.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=' 650px;']/div/div[2]/div[2]/button/span").click()

  • 相关阅读:
    c&c++中的宏
    cmake教程
    什么是Grunt
    npm-install camo
    在node.js中建立你的第一个HTTp服务器
    highChart数据动态更新
    css:before和after中的content属性
    清除float浮动三种方式
    中文标准web字体
    网站桌面端和手机端不同url的设置
  • 原文地址:https://www.cnblogs.com/huny/p/12045463.html
Copyright © 2011-2022 走看看