Python Selenium не может ничего получить при использовании метода .text
HTML/CSS, который я пытаюсь извлечь, я пытаюсь извлечь выделенный текст
Я специально пытаюсь получить код подтверждения из электронного письма от Mailinator, однако я пытался получить и распечатать текст из чего угодно, и при использовании функции .text ничего не сохраняется. Кроме того, я могу использовать только find_elements(By.XPATH, "example"), а не find_elements_by_xpath("example") в качестве примера (то же самое для css_selector и т. д.). Для справки: я использую самую последнюю версию Python и Visual Studio. Код в качестве моей среды. Кто-нибудь знает, в чем может быть проблема? Я перепробовал несколько источников, но не могу найти случай, аналогичный тому, что я получаю.
Я должен добавить, что я также пробовал очищать данные и получаю тот же результат, хотя это была скорее попытка просто найти все элементы, которые соответствуют регулярному выражению, и сохранить их с помощью цикла.
Я не получаю сообщения об ошибке, просто он не сохраняет текст или, по крайней мере, не печатает его. Он печатает \n. Кстати, дело не только в этом коде. Я попробовал несколько веб-сайтов, включая домашнюю страницу Google, и мне не удалось сохранить и распечатать текст из любого места в Интернете. Для справки, это код с удаленными учетными данными (если вы видите какие-либо другие ошибки, сообщите мне):
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
**# from faker import Faker
**# import re****
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 20)
username = '*'
driver.get("https://www.mailinator.com/v4/login.jsp")
wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/main/div/div/div/section/form/div[2]/input"))).send_keys(
"*")
wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/main/div/div/div/section/form/div[3]/input"))).send_keys(
"*")
wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/main/div/div/div/section/form/div[4]/a[1]"))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(@id,'row_"+ username +"')]/td[2]"))).click()
iframe = driver.find_element('tag name', 'iframe')
print('line21 executed')
driver.switch_to.frame(iframe)
print('line23 executed')
email_text = driver.find_element('tag name', 'body').text
print('line25 executed')
print(email_text)
print('line27 executed')
Я пытаюсь сохранить текст, чтобы можно было извлечь проверочный код и ввести его в рамках процесса регистрации при выполнении BDD для проекта, но на данный момент я натыкаюсь на эту преграду в течение нескольких часов и не могу решить проблему. .
РЕДАКТИРОВАТЬ:
После предложений я обновил код следующим образом и покажу результат внизу:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# from faker import Faker
# import re
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 20)
username = '*'
driver.get("https://www.mailinator.com/v4/login.jsp")
wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/main/div/div/div/section/form/div[2]/input"))).send_keys(
"*")
wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/main/div/div/div/section/form/div[3]/input"))).send_keys(
"*")
wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/main/div/div/div/section/form/div[4]/a[1]"))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(@id,'row_"+ username +"')]/td[2]"))).click()
iframe = driver.find_element(By.ID, 'html_msg_body')
print('line21 executed')
driver.switch_to.frame(iframe)
print('line23 executed')
email_text = wait.until(EC.visibility_of_element_located(('tag name', 'body'))).text
print('line25 executed')
print(email_text)
print('line27 executed')
Вывод: строка 21 выполнена, строка 23 выполнена, строка 25 выполнена.
строка27 выполнена
РЕДАКТИРОВАТЬ 2:
Я сделал код общедоступным Mailinator. Это следующий код на письмо:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# from faker import Faker
# import re
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 20)
driver.get("https://www.mailinator.com/v4/public/inboxes.jsp?to=testingfor042223")
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="row_testingfor042223-1682214679-12524595"]/td[2]'))).click()
# wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/main/div[2]/div[3]/div/div[4]/div/div/table/tbody/tr/td[2]"))).click()
iframe = driver.find_element(By.ID, 'html_msg_body')
print('line21 executed')
driver.switch_to.frame(iframe)
print('line23 executed')
body = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "body")))
print('line25 executed')
print(body.text)
print('line27 executed')
1 ответ
Имея доступ к самой электронной почте, я смог заставить ее работать. Проблема заключалась в том, что страница загружалась, а затем загружалась снова, в результате чего исходное тело BODY устарело. Итак, я взял исходный тег BODY, подождал, пока он устареет, снова взял его и напечатал текст. Я проверил, что код ниже работает.
ПРИМЕЧАНИЕ. Я оставил это, но закомментировал строки входа в систему, если вы захотите использовать их позже, после сброса URL-адреса.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.mailinator.com/v4/public/inboxes.jsp?to=testingfor042223")
username = '*'
wait = WebDriverWait(driver, 10)
# wait.until(EC.visibility_of_element_located((By.ID, "many_login_email"))).send_keys("email")
# wait.until(EC.visibility_of_element_located((By.ID, "many_login_password"))).send_keys("password")
# wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[aria-label='Login link']"))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//td[contains(text(),'Your verification code')]"))).click()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "html_msg_body")))
body = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "body")))
wait.until(EC.staleness_of(body))
body = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "body")))
print(body.text)