driver = webdriver.Chrome(service=s)
url="https://fourminutebooks.com/book-summaries/"
driver.get(url)
page_tabs = driver.find_elements(By.CSS_SELECTOR, "a[class='post_title w4pl_post_title']")
#html = driver.find_elements(By.CSS_SELECTOR,"header[class='entry-header page-header']")
length_page_tabs = len(page_tabs)
in_length = len(page_tabs)
for i in range(length_page_tabs):
ran = random.randint(0,in_length)
page_tabs[ran].click()
driver.execute_script("window.history.go(-1)")
time.sleep(10)
#need to get page source of html and then open it to a new file, extract what I want and add it to the email
我正在嘗試單擊其中一個鏈接,獲取 html 代碼,將其通過電子郵件發送給自己,然后回傳頁面并重復。但是,單擊第一個隨機鏈接后,代碼停止作業,而是出現此錯誤
uj5u.com熱心網友回復:
當您將一些元素集合放入變數并進行迭代并執行一些操作時,您必須非常小心。
page_tabs = driver.find_elements...
在這種情況下,所有元素都被快取,并且導航到另一個頁面、重繪 頁面等的每個 Web 瀏覽器操作都會使所有這些快取的元素過時。這意味著它們已經過時了,無法再與它們互動。
因此,為了避免過時的元素參考錯誤,您必須防止任何頁面重新加載,或者在頁面狀態更改后每次重繪 元素。
uj5u.com熱心網友回復:
陳舊元素參考例外
StaleElementReferenceException是一種WebDriverException當對元素的參考消失時拋出stale,即元素不再出現在頁面的HTML DOM上。
StaleElementReferenceException的一些可能原因包括:
- 您不再在同一頁面上,或者自上次定位該元素以來頁面可能已重繪 。
- 該元素可能已被洗掉并重新添加到DOM Tree,因為它已被定位。比如一個元素被重新定位。當更新值并重建節點時,這通常會發生在javascript框架中。
- 元素可能位于 iframe 或其他已重繪 的背景關系中。
這個用例
在您的用例中,您使用定位器策略創建了一個webelement串列,即page_tabs:
page_tabs = driver.find_elements(By.CSS_SELECTOR, "a[class='post_title w4pl_post_title']")
每當您呼叫單擊時,回圈中的下一步都會page_tabs[ran]被重定向到一個新頁面,其中串列中的元素page_tabs變得陳舊并加載新元素。
當您呼叫時向前移動,您driver.execute_script("window.history.go(-1)")將回傳到元素存在的主頁,page_tabs并且它們再次重新加載。此時,該串列page_tabs仍繼續包含先前搜索的 web 元素,這些元素現在已變得陳舊。因此,在第二次迭代期間,您將面臨StaleElementReferenceException
解決方案
在您的用例中避??免StaleElementReferenceException因為所需的元素是標記,因此您可以將屬性存盤在串列中并按如下方式呼叫,<A>而不是保存元素:hrefget(href)
driver.get("https://fourminutebooks.com/book-summaries/")
hrefs = [my_elem.get_attribute("href") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a[class='post_title w4pl_post_title']")))]
for href in hrefs:
driver.get(href)
print("Placeholder to perform the desired operations on the respective page")
driver.quit()
參考
您可以在以下位置找到一些相關的詳細討論:
- 使用 Python 迭代時出現 StaleElementException
- 訊息:過時的元素參考:元素未附加到 Python 中的頁面檔案
- StaleElementReferenceException:訊息:過時的元素參考:元素未使用 Selenium 和 Python 附加到頁面檔案
uj5u.com熱心網友回復:
使用 driver.execute_script 和 javascript。Javascript 永遠不會過時,因為它會立即進行評估。換句話說,如果您使用 Python 選擇了一個元素,然后與它進行互動,那么它很有可能不再存在。您可以確定它仍然存在的唯一方法是在與它互動時對其進行評估,而這樣做的唯一方法是留在瀏覽器背景關系中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/425777.html
