zoukankan      html  css  js  c++  java
  • selenium之坑(StaleElementReferenceException: Message: Element not found in the cache...)

    有时候循环点击一列链接,只能点到第一个,第二个就失败了

    原因是第二个已经是新页面,当然找不到之前页面的元素。就算是后退回来的,页面也是不一样的

    页面长的一样不一定是同一张页面,就像两个人长的一样不一定是同一个人,他们的身份证号不同,页面,甚至页面上的元素都是有自己的身份证号(id)的

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    
    print(driver.find_element_by_id('kw'))  # kw before refresh
    
    driver.refresh()  # refresh
    
    print(driver.find_element_by_id('kw'))  # kw after refresh
    
    driver.quit()
    """
    <selenium.webdriver.remote.webelement.WebElement (session="eaad4403c91da0736e9f3218a4d2ea7d", element="0.9658163881659727-1")>
    <selenium.webdriver.remote.webelement.WebElement (session="eaad4403c91da0736e9f3218a4d2ea7d", element="0.7123759980029825-1")>
    """

    我们发现,仅仅是刷新了一下页面,两次的element id是不同的,这就说明这是两个不同的元素,如果用以下的方式来定位,自然会因为找不到而报错

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    
    kw = driver.find_element_by_id('kw')  # 先定位并获得kw元素
    kw.click()
    
    driver.refresh()  # refresh
    
    kw.click()  # 刷新后,仍用原来的kw元素操作,这时会报错
    
    driver.quit()
    """

    selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
    (Session info: chrome=66.0.3359.181)
    (Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 6.1.7601 SP1 x86_64)


    """

    原因很明显,你用别人的身份证id去找现在的人,哪怕这两个人长的很像,他也会告诉你,对不起,你找错人啦

    refresh,无论你是主动刷新还是页面自动刷新

    back,已经跳转到了其他页面,然后你用driver.back()跳回来,这也是一张新的页面了

    跳转到了新的页面,但这张新页面上有一些元素跟之前页面是长的一样的,这也是一张新的页面了。比如:一排分页按钮,你点击下一页跳转到了第二页,想要还用原来的元素操作到下一页,那也是不可能的了

    除此之外可能还有其他的原因,总之看到类型差不多,但是对页面有了操作,就应该想想这种可能性

    遇到这种情况怎么办:

    很简单:

    刷新页面之后重新获取元素就行,不要提前获取一组元素,然后去循环操作每一个元素,这种情况还是获取元素的个数,然后在循环中获取相应位置的元素,在用的时候才去获取,这样你就获取到最新的id了

    遇到页面有变化的情况,不要去循环元素,去循环个数或定位方式,在循环中获取元素

  • 相关阅读:
    【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory
    XE10 塔建 Android 开发环境 (已测试通过)
    Erstudio8.0怎么用?Erstudio8.0汉化版详细使用教程
    Excel 信息对比_数组版
    百万级数据查询优化(数据库)
    sql查询重复记录、删除重复记录方法大全
    JS和JSON的区别
    JS中字符串的true转化为boolean类型的true
    关于HTTP协议,一篇就够了
    关于JS的prototype
  • 原文地址:https://www.cnblogs.com/z-x-y/p/9197339.html
Copyright © 2011-2022 走看看