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)
Другие вопросы по тегам