我正在撰寫一個網頁抓取腳本,它會自動登錄到我的電子郵件帳戶并發送一條訊息。
我已將代碼撰寫到瀏覽器單擊“新訊息”按鈕的位置。之后會打開一個新視窗(或框架?),我可以在其中輸入收件人地址、主題和訊息。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
myPassword = 'xxxxxxxxxxxxxxxx'
browser = webdriver.Firefox() # Opens Firefox webbrowser
browser.get('https://protonmail.com/') # Go to protonmail website
loginButton = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.btn-ghost:nth-child(1)")))
loginButton.click()
usernameElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#username")))
usernameElem.send_keys("[email protected]")
passwordElem = browser.find_element_by_css_selector("#password")
passwordElem.send_keys(myPassword)
anmeldenButton = browser.find_element_by_css_selector(".button")
anmeldenButton.click()
newMessage = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div[3]/div/div/div[1]/div[2]/button")))
newMessage.click()
addressElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#to-composer-1591")))
addressElem.send_keys('[email protected]')
在以下行的第一行,我收到 TimeoutException 錯誤:
addressElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#to-composer-1591")))
addressElem.send_keys('asdf')
我認為發生錯誤是因為瀏覽器不知道在哪里找到元素,對嗎?
我檢查了檔案:
新視窗或框架的源代碼:
<span class="flex-item-fluid p0-5 pr1 pl0-75 text-ellipsis user-select-none cursor-move">Neue Nachricht</span>

我不確定我是否以正確的方式解決問題。我試圖在源代碼中查找資訊,這有助于瀏覽器找到正確的元素并使用 .switch_to_window() 或 .switch_to_frame() 方法。首先,我不確定是否真的是切換到新視窗或框架的問題(我真的不知道它們之間的區別)。第二:如何實作切換到新元素,以便瀏覽器可以應用 .send_keys() 方法?
uj5u.com熱心網友回復:
我看了看HTMLDOM,看不到任何 iframe 或視窗被打開。
您無法與輸入欄位互動的原因是因為您使用的是這個 CSS 選擇器#to-composer-1591,最后一部分 1591 本質上是動態的,這意味著它會在每個新的瀏覽器實體上發生變化。
修復:
您應該使用input[id^='to-composer']在整個 HTMLDOM 中是唯一的。
addressElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[id^='to-composer']")))
addressElem.send_keys('[email protected]')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/419678.html
標籤:
上一篇:WebDriverException:訊息:服務geckodriver意外退出。狀態碼是:在FreeBSD監獄中使用SeleniumGeckodriverFirefox時出現64錯誤
