首先,如果较早出现类似的话题,对不起,但是我找不到像我这样的问题。
我想创建一个简单的脚本,该脚本可以进入电子邮件网站,登录我的帐户并查找未读邮件的数量。
这是登录的部分
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>
答案 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()
答案 1 :(得分:0)
首先,我将避免使用睡眠。您可以尝试使用WebDriverWait代替。这将暂停浏览器,直到满足给定条件为止。
例如如下
WebDriverWait(self.driver, 60).until(EC.presence_of_element_located((By.XPATH, "//button[text()='Login']")))
这将最多等待60秒,以使元素(带有登录文本的按钮)出现在页面中。
答案 2 :(得分:0)
登录到您的邮件帐户后,driver.title
和driver.current_url
之类的命令有效,但它们不属于DOM Tree的一部分。
相关的HTML可以帮助我们构造一个规范的答案。但是,要提取所需的文本,必须为visibility_of_element_located()
引入 WebDriverWait ,并且可以使用以下Locator Strategies中的任何一个:
使用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