Драйвер Selenium не может найти какой-либо элемент после входа на сайт [Python] - PullRequest
0 голосов
/ 10 февраля 2020

Прежде всего, если подобные топи c произошли ранее, извините, но я не смог найти ни одной проблемы, подобной моей.

Я хотел бы создать простой сценарий, который вводится в электронное письмо веб-сайт, войдите в мою учетную запись и найдите количество непрочитанных сообщений.

Это часть с входом в систему

from selenium import webdriver
from time import sleep

class sMailBot():
    def __init__(self):
        self.driver = webdriver.Chrome()

    def login(self):
        self.driver.get('website.com')

        sleep(2)

        btn_login = self.driver.find_element_by_xpath('//*[@id="username"]')
        btn_login.send_keys('my_username')

        btn_password = self.driver.find_element_by_xpath('//*[@id="password"]')
        btn_password.send_keys('my_password')

        btn_logintoaccount = self.driver.find_element_by_xpath('//*[@id="button"]')
        btn_logintoaccount.click()

        sleep(5)

Это работает очень хорошо. После входа в мою учетную запись почты работают комментарии типа driver.title или driver.current_url .

Теперь я хотел бы удалить эту часть кода html:

<b>some_important_string_which_stores_the_amount_of_unread_mails</b>

Я пытался сделать это, используя его путь

driver.find_element_by_xpath('//*[@id="MS_act1"]/span)

Однако это не так Работа. Более того, я не могу найти другие элементы с этой стороны.

Я хотел бы подчеркнуть, что я ждал загрузки страницы более 10 секунд.

Произошла ошибка

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="MS_act1"]/span/b"}
  (Session info: chrome=80.0.3987.87)

Как вы и просили, я добавляю немного окружающего HTML кода

<span style="float: right">
<b>some_important_string_which_stores_the_amount_of_unread_mails</b> 
</span>

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Прежде всего я буду избегать использования сна. Вместо этого вы можете попробовать WebDriverWait . Это будет приостанавливать работу браузера до тех пор, пока не будет выполнено заданное условие.

, например, следующим образом

WebDriverWait(self.driver, 60).until(EC.presence_of_element_located((By.XPATH, "//button[text()='Login']")))

Это будет ждать максимум 60 с c для элемента (кнопка с текстом Login) для встречаются на странице.

0 голосов
/ 11 февраля 2020

После входа в вашу учетную запись почты такие команды, как driver.title и driver.current_url, работают, но они не являются частью DOM Tree .

Соответствующий HTML помог бы нам построить канонический ответ. Однако, чтобы извлечь нужный текст, вы должны вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любую из следующих Стратегий локатора :

  • Использование CSS_SELECTOR и get_attribute("innerHTML"):

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "[id^='MS_act'] span>b"))).get_attribute("innerHTML"))
    
  • Использование XPATH и text атрибут:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[starts-with(@id, 'MS_act')]//span/b"))).text)
    
  • Примечание : необходимо добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 10 февраля 2020

Пожалуйста, не используйте sleep, это не лучший выбор для селена.

Вместо этого используйте ожидание селена:

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

https://selenium-python.readthedocs.io/waits.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...