zoukankan      html  css  js  c++  java
  • selenium中常见的无法定位元素问题

    一. 脚本已在执行,但你所定位的元素却没加载出来,此时就会出现元素不存在的情况

    这个很常见也很简单只需要等待一下就可以了。我们来看一下几种等待方式:

      1. time.sleep(n)  (强制等待。不管资源是否加载出来都强制等待n秒)

    强制等待n秒。Python本身的函数,包含在time包中,使用前需要导入time包。我们之前的实例中经常会使用这种等待。这种等待方法十分笨拙,无论页面加载得如何,都必须等待n秒,可以说是十分不智能了。

      2. implicitly_wait(n)  (隐式等待。隐式等待针对的是页面!n秒内页面加载完成则执行下一步,否则一直等到时间截止,然后执行下一步,超出设置的时长还没有定位到元素,则抛出异常。)

    最长等待n秒,若n秒内页面加载完成,则提前结束等待。WebDriver提供的等待方法,也被称为隐式等待,比强制等待聪明了一点,但如果页面本身包含一个超大视频之类的文件,就算我们需要定位的元素在最开始已经加载出来,却依旧要等待所有文件加载结束之后,脚本才能继续执行,依旧算是有些弊端。

      3. WebDriverWait(n)  (显示等待。显示等待针对的是元素!n秒内每隔一段时间(默认0.5秒)去查看元素是否存在)

    最长等待n秒,n秒内每隔一段时间去检查需要定位的元素是否存在,若存在则提前结束等待。也是WebDriver提供的等待方法,也被称为显性等待,这种等待比隐性等待更智能了一些,无视整个页面的加载,只要需要的元素存在了,就结束等待。

    这里有几个需要注意的地方:

    • 隐式等待针对的是页面!显示等待针对的是元素!
    • 隐性等待和显性等待同时存在时,取两者中最长的等待时间为有效等待时间
    • 隐性等待设置一次,即贯穿整个脚本

     

     二. 当待操作元素在可视区域外,则需要先将待操作元素滚动到可视区域然后才能操作元素。否则也会出现元素不存在或者找不到的情况。

    我这里是调用js代码的方式实现,可能还有很多其他方法。

    先了解一下selenium调用js代码有两种方法:

    execute_script() 、execute_async_script()

    1. execute_script() 方法 

    这个方法用的比较多,

    2.execute_async_script() 方法

    基本思路:

    1.先定位到元素

    target = self.browser.find_element_by_xpath(location.project_laiyuan)

    2.再将元素拖动到可视区域(通过执行JavaScript语句实现)

    self.browser.execute_script("arguments[0].scrollIntoView();", target)
     

    3.再操作元素

    target.click()

     

    三.点击某些按钮时会打开新窗口,此时窗口句柄已发生变化导致无法定位元素。

    这个我之前有一篇博客写到过(点击查看)

    四.

  • 相关阅读:
    自动刷新页面
    docker 数据卷管理
    docker container(容器)
    docker images
    docker 设计原理
    hbase数据原理及基本架构
    详谈kafka的深入浅出
    django介绍及路由系统
    mysql爱之深探测
    mysql数据库内容相关操作
  • 原文地址:https://www.cnblogs.com/zhuyalong/p/13933057.html
Copyright © 2011-2022 走看看