Selenium3+python3自动化(四十二)--批量操作循环点击报错

前言

selenium定位一组元素,批量操作循环点击的时候会报错:element is not attached to the page document

实现目标:批量点击标题,获取每个页面的url地址

 代码如下:

# coding:utf-8
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://www.cnblogs.com/canglongdao/")
titles=driver.find_elements_by_xpath("//div[@id='main']/div/h2/a")
for i in titles:
    i.click()
    print(driver.current_url)
    driver.back()

 运行结果:

https://www.cnblogs.com/canglongdao/p/13613712.html
Traceback (most recent call last):
  File "E:/study/selenium_study/a825.py", line 7, in <module>
    i.click()
  ...
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=84.0.4147.135)

why?

由于第一次点击后,返回页面时,刷新了

页面刷新后元素的属性是没变,但是element的值却变了,所有之前定位的元素element都过期了。

分析问题

1.当页面上有点击时,进入新页面,返回时,会刷新;我们可以分别打印出点击前后的元素

from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://www.cnblogs.com/canglongdao/")
titles=driver.find_elements_by_xpath("//div[@id='main']/div/h2/a")
print(len(titles),titles)
titles[0].click()
driver.back()
titles1=driver.find_elements_by_xpath("//div[@id='main']/div/h2/a")
print(len(titles1),titles1)

 运行结果:

备注:结果太长,省略了部分内容

10 [<selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="bc6de2dd-fc1a-4e37-8f90-118de5c46015")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="778840eb-f73d-4582-a51c-26f35e3f8089")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="0d7a69e7-56f0-48be-919c-bd59a013daa7")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="5685242c-0e9d-4e73-ac33-a83fcccda30a")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="bdafb424-8702-431a-9b01-5d9a59a3a13a")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="2b71b4e0-faa4-41eb-8ac3-e80901e3a168")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="8a1e1456-a758-4a64-b43e-3f7addec78a4")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="27e19bd2-06bc-4a92-86ed-7e9c3ae39f73")>, ...]
10 [<selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="a393f14d-981b-420b-9b90-6bd3b695f85b")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="0a5189bb-023e-47ca-b6ec-83da32bf1ddc")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="a9b0ba6e-90b0-454b-a929-9f330db364c5")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="22db1afb-a776-42dc-b382-cf205023287d")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="ebef7af3-e1d5-4ed2-9067-18d5a0e87a67")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="f508561b-f1f3-4061-b837-796dadc9e549")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="747b76bf-8206-4ab3-b644-ad2f5acc0f50")>, <selenium.webdriver.remote.webelement.WebElement (session="6f7e4c697ef849a815da94306d9ce051", element="7c593930-192a-441b-8812-d051d952d93b")>,...]

 2.很明显element里面的值发生了变化,所以第一次点击是可以的,点完之后,再使用旧数据点击会报错。

解决方案

1.针对页面刷新后,之前的的元素失效问题,在for循环体里面可以重新定位一次,覆盖掉之前旧的就行了。

2.第一次获取全部元素后,通过len函数获取总个数

3.for循环的时候不要循环定位元素的list对象,换成range函数去循环

参考代码:

# coding:utf-8
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://www.cnblogs.com/canglongdao/")
titles=driver.find_elements_by_xpath("//div[@id='main']/div/h2/a")
lent=len(titles)
print(lent,titles)

for i in range(lent):
    titles[i].click()
    print(driver.current_url)
    driver.back()#点完之后返回
    #重新获取一次元素
    titles=driver.find_elements_by_xpath("//div[@id='main']/div/h2/a")

  运行结果:

10 [<selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="523026e8-0674-4997-850c-e09e5e2c1a4a")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="c1049b3c-1007-489f-bb8d-f50a904cb12f")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="e3c63b0f-5a57-4d9a-aa45-fecb5d7b96c1")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="383a1f34-b3f5-4509-9120-72e3ea542440")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="2292395c-ecbd-4c3a-abc0-dea26f00a739")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="59f62940-ca9e-4f98-9b0c-ed0f3852573f")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="082c346c-2c88-4e4a-8894-6dbde9aa2cd2")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="350fa971-1b20-4791-9462-e366ca837970")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="ae77ccbe-ff70-49e0-9af4-73de5caa801e")>, <selenium.webdriver.remote.webelement.WebElement (session="eaaf5164ef0fc9b3e8c82e951e6ea615", element="58c705d4-8774-4ae6-9d0f-e67057f97ba4")>]
https://www.cnblogs.com/canglongdao/p/13613712.html
https://www.cnblogs.com/canglongdao/p/13613567.html
https://www.cnblogs.com/canglongdao/p/13613089.html
https://www.cnblogs.com/canglongdao/p/13608438.html
https://www.cnblogs.com/canglongdao/p/13608764.html
https://www.cnblogs.com/canglongdao/p/13608311.html
https://www.cnblogs.com/canglongdao/p/13607931.html
https://www.cnblogs.com/canglongdao/p/13607490.html
https://www.cnblogs.com/canglongdao/p/13606710.html
https://www.cnblogs.com/canglongdao/p/13605834.html

  

越努力,越幸运!!! good good study,day day up!!!
原文地址:https://www.cnblogs.com/canglongdao/p/13614180.html