• selenium之坑:点击后页面刷新重新获取刷新前的页面(StaleElementReferenceException:Message:Element not found in the cache...)


    循环点击一列链接,但只能点到第一个,第二个失败,这是为什么,因为第二个已经是新页面,当然找不到之前页面的元素,虽然元素没变,甚至是后退回来,页面都没有变,为什么是新页面,页面长的一样不代表是同一张页面,就像两个人长得一样不一定是同一个人,他们身份证号不同,页面,页面上的元素都是有自己的身份证号的

    #coding:utf8
    
    from selenium import webdriver
    
    driver=webdriver.Chome()
    
    driver.get(url)
    
    print(driver.find_element_by_id('kw'))
    
    driver.refresh()
    
    print(driver.find_element_by_id('kw'))
    
    driver.quit()

    结果:

    <selenium.webdriver.remote.webelement.WebElement (session="d726e8fdfbc05f9bea26e33d09a2a67f", element="0.6155236891000833-1")>
    <selenium.webdriver.remote.webelement.WebElement (session="d726e8fdfbc05f9bea26e33d09a2a67f", element="0.3351209127484813-1")>

     

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

    #coding:utf8
    
    from selenium import webdriver
    
    driver=webdriver.Chrome()
    url='http://www.baidu.com'
    driver.get(url)
    
    kw=driver.find_element_by_id('kw')
    kw.click()
    
    driver.refresh()
    
    kw.click()
    driver.quit()
    
    结果:

    Traceback (most recent call last):
    File "D:/py3code/xxx/last_week/test.py", line 16, in <module>
    kw.click()
    File "D:py3.6libsite-packagesseleniumwebdriver emotewebelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
    File "D:py3.6libsite-packagesseleniumwebdriver emotewebelement.py", line 628, in _execute
    return self._parent.execute(command, params)
    File "D:py3.6libsite-packagesseleniumwebdriver emotewebdriver.py", line 312, in execute
    self.error_handler.check_response(response)
    File "D:py3.6libsite-packagesseleniumwebdriver emoteerrorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
    (Session info: chrome=68.0.3440.106)
    (Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 6.1.7601 SP1 x86_64)

     

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

    当然,不仅仅这一种情况,如果你执行以下的操作,都有可能找错人:

    refresh,不论你是主动刷新还是自动刷新

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

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

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

    遇到这种情况该肿么办?

    很简单:

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

    总之一句话,遇到页面有变化的情况,不要去循环元素,去循环个数或者定位方式,再循环中获取元素

    解决方法示例:

    错误写法:

    all_a=driver.find_elements_by_class('class_name')
    for a in all_a:
        a.click()

    这样就容易点击了第一个a之后,页面出现刷新的情况,再想点第二个就会报这个错

    可以改成:

    counts_a=len(driver.find_elements_by_class('class_name'))
    for i in range(counts_a):
        driver.find_elements_by_xpath('//a[@class="class_name"][i+1]').click()

    可能会更好一些,当然,也有其他的写法,大概意思就是需要在刷新后重新去定位一次,再用重新定位到的元素去操作

  • 相关阅读:
    牛客网Java刷题知识点之方法覆盖(方法重写)和方法重载的区别
    牛客网Java刷题知识点之自动拆装箱
    安装Phoenix时./sqlline.py执行报错File "./sqlline.py", line 27, in <module> import argparse ImportError: No module named argparse解决办法(图文详解)
    Apache-kylin-2.0.0-bin-hbase1x.tar.gz的下载与安装(图文详解)
    Apache Kylin的架构特性
    Apache Kylin Cube 的存储
    Apache Kylin Cube 的构建过程
    Apache Kylin的核心概念
    中央网络安全和信息化领导小组办公室
    中国智慧城市建设投资联盟
  • 原文地址:https://www.cnblogs.com/z-x-y/p/9805272.html
Copyright © 2020-2023  润新知