zoukankan      html  css  js  c++  java
  • selenium踩坑笔记

    1、遍历表格数据,使用元素.text方法,有些数据的值不为空,但遍历出来的值却为空,例子如下


    eles=driver.find_elements_by_xpath("XXX") for ele in eles: name=ele.text

    这种方法获取的name,可能有存在name有值,但获取到的是空字符串的情况。

    解决办法:如果通过get_attribute()属性值获取的方法可以替代text方法尽量用此方法替代,如下:

    eles=driver.find_elements_by_xpath("XXX")
    for ele in eles:
        name=ele.get_attribute("title")

    经验证,通过get_attribute()获取文本的方法比text稳定。

    2、execute_script() 方法执行 JavaScript 的来解决页面上一些 selenium 无法操作的元素,但是一直无法获取执行的返回值

    js = 'document.getElementById("Frank");'
    Frank = driver.execute_script(js)
    print(blog)  # 返回元素对象,结果返回为None
    

      解决办法:在JS语句前面加上return,才能返回元素对象。eg: js = 'return document.getElementById("Frank");'

    3、元素明明存在,但是死活定位不到(不存在frame的问题)

    eg:需要定位到一个checkbox框,但是通过xpath定位,同层级的span元素("//*[FrankTable]/tbody/tr[2]/td[3]/lable/span]")定位到了,checkbox元素("//*[FrankTable]/tbody/tr[2]/td[3]/lable/input]")却定位不到

    解决办法:

    使用JS语句进行定位,代码如下

    js='return document.querySelector("#FrankTable");'
    checkbox=self.driver.execute_script(js)
    

    4、selenium.common.exceptions.StaleElementReferenceException: Message:stale element reference: element is not attached to the page document

    原因:现在的web应用和以前大不相同,以前的web应用大都是后端直接产生最终的html界面,而现在呢?很多是页面加载后(也加载javascript前端代码), 由前端代码动态改变界面的内容,比如从后端获取一些数据后,再动态改变界面的内容。
    尤其是很多采用了框架像angular,react,vue这些都会这样做。这样就有一个问题,开始的时候获取的html只是一个模板一样的文档,里面的数据没有产生,而是需要等前端js代码动态的再次向后端查询数据后, 才动态的向html模板中填入数据或者修改数据。
    eg:一下子获取了多个删除按钮 元素,然后用循环点击 每个删除按钮但是当点击第一个按钮之后,页面有些部分被更新了,剩余的几个按钮,虽然看起来还是原来的样子。但是已经是新的界面元素了所以,你通过原来老的 界面元素点击 ,就会出现这个错误
    解决办法:
    重新获取元素
    def DeleteAllCourse(driver):
        while 1: #保证每次删除完按钮重新获取元素,当删除按钮数量为0时退出循环
            delButtons = driver.find_elements_by_name('li')
            if len(delButtons)<1:
                break
            delButtons[0].click()
            time.sleep(1)
    

    5、弹窗定位不到(没frame)

    解决办法:

    handles = driver.window_handles #获取所有窗口

    print(handles)

    查看所有窗口,如果有多余窗口,说明改弹窗以窗口的形式存在,相当于表面上看起来是一个窗口,实际上内嵌了另外一个窗口了。

    driver.switch_to.window(handles[1]) #切换窗口

     6、class属性有空格,定位不到元素。

    eg:<span class="name test" username="qq_41952323">Dance Wang</span>

    driver.find_element_by_class_name("name test")无法定位

    解决办法:

    以空格为分界线,相当于两个 class属性值,两个属性值都可以进行定位。

    driver.find_element_by_class_name("name") or driver.find_element_by_class_name("test")都可进行定位

     7、一个普通的添加按钮并带有唯一ID,点击后无反应(用了js点击也没反应)

    解决办法:使用鼠标模拟双击。

    from selenium.webdriver.common.action_chains import ActionChains

    ele = driver.find_element_by_id("id")

    ActionChains(driver).double_click()(ele).perform()
     
     8、页面存在,但是不可见的元素,获取不到text
    解决办法1:使其可见再进行获取。
    解决方法2:直接使用js方法获取
    eg:js = "return document.querySelector('.Frank').innerText"
      text = driver.execute_script(js)
    解决方法3:使用get_attribute("innerText")
     
     
     
  • 相关阅读:
    RecyclerView,ListView first item get focus
    一种粗暴快速的Android全屏幕适配方案(转)
    谈谈单元测试之(一):为什么要进行烦人的单元测试(转)
    SCIgen与野鸡期刊的梗
    百度搜索仍然是【最快解决工作问题的方法】
    搭建minima主题的github博客网站
    本科期间的第一个专利:改卷筒的故事
    学习消费思维的【贫穷与富有】
    我的联系方式
    学习 GitHub 有什么好处?
  • 原文地址:https://www.cnblogs.com/Frank-guo/p/13940408.html
Copyright © 2011-2022 走看看