Selenium驱动程序登录网站[Python]

时间:2020-02-10 14:11:34

标签: python selenium selenium-webdriver

首先,如果较早出现类似的话题,对不起,但是我找不到像我这样的问题。

我想创建一个简单的脚本,该脚本可以进入电子邮件网站,登录我的帐户并查找未读邮件的数量。

这是登录的部分

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 :(得分:0)

请不要使用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

答案 1 :(得分:0)

首先,我将避免使用睡眠。您可以尝试使用WebDriverWait代替。这将暂停浏览器,直到满足给定条件为止。

例如如下

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

这将最多等待60秒,以使元素(带有登录文本的按钮)出现在页面中。

答案 2 :(得分:0)

登录到您的邮件帐户后,driver.titledriver.current_url之类的命令有效,但它们不属于DOM Tree的一部分。

相关的HTML可以帮助我们构造一个规范的答案。但是,要提取所需的文本,必须为visibility_of_element_located()引入 WebDriverWait ,并且可以使用以下Locator Strategies中的任何一个:

  • 使用CSS_SELECTORget_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