前言
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