【问题标题】:selenium.common.exceptions.TimeoutException: Message:selenium.common.exceptions.TimeoutException:消息:
【发布时间】:2021-02-09 03:46:09
【问题描述】:

我已经查看了描述该问题的线程,但无法提出解决方案,因为已经存在的答案已经过时并且似乎与实际问题没有任何关系。我正在尝试使用 Selenium WebDriver 设置一个 Python 脚本,这将允许我使用 Telegram Web 对我的 Telegram 帐户自动执行操作。

注意:您无需拥有 Telegram 帐户即可查看问题所在。

我想做什么:脚本要求您输入国家代码和电话号码。然后它应该将此信息填充到网页上的输入框中。到目前为止,该脚本设法将国家代码解析到正确的输入框并将其放置得很好。但是在将电话号码放入输入框中时,我得到 selenium.common.exceptions.TimeoutException 错误。我不明白为什么。

这是我的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from time import sleep
from platform import system
from os import getcwd, getlogin, getenv

cwd = getcwd()
os = system()
user = getlogin()
appdata = getenv('APPDATA')

country_code = input("Phone number country code: ")
phone_number = input("Phone number: ")

    if os == "Linux":
        if user == "root":
            print(
                "You are executing the script as root. Make sure that the Firefox profile folder is also located in the root directory.")
        driver = webdriver.Firefox(executable_path=cwd + "/geckodriver",
                                   firefox_profile="/home/" + user + "/.mozilla/firefox/kqskr2vn.default-esr")
    elif os == "Windows":
        driver = webdriver.Firefox(executable_path=cwd + "\\geckodriver.exe",
                                   firefox_profile=appdata + "\\Mozilla\\Firefox\\Profiles\\f4ymhsbu.default-esr-1")
    # elif os == "Darwin":
    
    page_number = 1
    wait = WebDriverWait(driver, 10)
    driver.get("https://web.telegram.org/#/login")
    
    wait.until(
        ec.presence_of_element_located((By.CSS_SELECTOR, "input.md-input.ng-pristine.ng-valid.ng-not-empty.ng-touched")))
    cc_ID = "input.md-input.ng-pristine.ng-valid.ng-not-empty.ng-touched"
    driver.find_element_by_css_selector(cc_ID).click()
    driver.find_element_by_css_selector(cc_ID).send_keys(Keys.CONTROL + "a")
    driver.find_element_by_css_selector(cc_ID).send_keys(Keys.BACKSPACE + country_code)
    sleep(5)
    wait.until(ec.presence_of_element_located(
        (By.CSS_SELECTOR, "input.md-input.ng-pristine.ng-untouched.ng-empty.ng-invalid.ng-invalid-required")))
    pn_ID = "input.md-input.ng-pristine.ng-untouched.ng-empty.ng-invalid.ng-invalid-required"
    driver.find_element_by_css_selector(pn_ID).click()
    driver.find_element_by_css_selector(pn_ID).send_keys(phone_number)

我尝试过的:

我检查了我是否没有使用“ec.presence_of_element_located”方法,而网页将包含同一类型和类下的多个元素。与此相关的某些错误,您必须使用“presence_of_all_elements_located”或指定您尝试访问的错误,可能使用 :nth-of-type/child 选择器。此 CSS 选择器仅在页面上出现一次,因此这似乎不会导致问题。

我已经使用“wait.until”方法检查了元素是否存在,并且出于纯粹的绝望还尝试使用“sleep(x)”。这并没有解决问题,它还应该产生一个不同的异常“没有这样的元素”。

由于没有 WebDriver 错误并且浏览器打开得很好,这让我相信不存在与不正确的 WebDriver 路径或任何此类情况相关的任何问题。

我不知道是什么原因导致了这个问题,所以如果你知道,请随时纠正我的错误!感谢任何人!

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver geckodriver


    【解决方案1】:

    首先,我英语说得不好。对此我很抱歉。

    此部分出现错误。我猜这个错误是由于类..

    wait.until(ec.presence_of_element_located(
            (By.CSS_SELECTOR, "input.md-input.ng-pristine.ng-untouched.ng-empty.ng-invalid.ng-invalid-required")))
    

    你可以这样试试吗..

    wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "input.ng-pristine.ng-empty.ng-invalid.ng-invalid-required.ng-touched")))
    pn_ID = "input.ng-pristine.ng-empty.ng-invalid.ng-invalid-required.ng-touched"
    

    【讨论】:

    • 天哪。您的代码有效。您能否提供有关我做错了什么以及为什么会发生错误的见解,以便我下次可以变得更好?非常感谢你。
    猜你喜欢
    • 2021-03-25
    • 2021-04-20
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多