我正在撰寫一個網頁抓取腳本,它會自動登錄到我的電子郵件帳戶并發送一條訊息。
我已將代碼撰寫到瀏覽器必須輸入訊息的地步。我不知道如何正確訪問輸入欄位。我已經看到它是一個 iframe 元素。我必須使用該switch_to_frame()方法嗎?我該怎么做?如果沒有 name 屬性,如何切換到 iframe?我需要該switch_to_frame()方法還是可以只使用該find_element_by_css_selector()方法?
這是 iframe 的源代碼:

這是我的代碼:
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, "input[id^='to-composer']")))
addressElem.send_keys('[email protected]')
subjectElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[id^='subject-composer']")))
subjectElem.send_keys('anySubject')
messageElem = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#squire > div > div:nth-child(1)")))
messageElem.send_keys('message')
uj5u.com熱心網友回復:
要訪問iframe<input>中的欄位,您必須:
誘導WebDriverWait使所需的幀可用并切換到它。
誘導WebDriverWait使所需元素成為可點擊的。
您可以使用以下任一定位器策略:
使用CSS_SELECTOR:
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[title='Editor']"))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#squire"))).send_keys('message')使用XPATH:
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@title='Editor']"))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='squire']"))).send_keys('message')
注意:您必須添加以下匯入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
PS:由于
<div>標簽具有屬性contenteditable="true"您仍然可以向元素發送文本。
參考
您可以在以下位置找到一些相關的討論:
- 通過 Selenium 和 python 切換到 iframe
- selenium.common.exceptions.NoSuchElementException:訊息:沒有這樣的元素:嘗試使用 selenium 單擊下一步按鈕時無法找到元素
- python中的硒:NoSuchElementException:訊息:沒有這樣的元素:無法找到元素
uj5u.com熱心網友回復:
您必須使用方法切換到 iframe driver.switch_to.frame。
像任何其他 web 元素一樣,iframe 元素可以通過ID、CLASS、XPATH等定位CSS_SELECTOR。
看起來在這里你可以使用這個方法:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[title='Editor']")))
或者
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[data-testid='squire-iframe']")))
在 iframe 中完成作業后,您將不得不切換回默認內容
driver.switch_to.default_content()
uj5u.com熱心網友回復:
你首先需要切換到 iframe
wait = WebDriverWait(driver, 30)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[title='Editor']")))
現在在這里撰寫代碼以發送訊息正文。像這樣的東西:
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[title='Editor']")))
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#squire"))).click()
email = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div#squire div:nth-child(2)")))
email.send_keys('write the email here')
同樣,一旦你完成了 iframe 互動,你應該切換到默認內容:
driver.switch_to.default_content()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/420028.html
標籤:
