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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM