selenium.common.exceptions.TimeoutException:消息:

selenium.common.exceptions.TimeoutException: Message:

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

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

我想做什么:脚本要求您提供国家代码和 phone 号码。然后它应该将这些信息填入网页上的输入框。到目前为止,脚本设法将国家代码解析到正确的输入框并将其放置得很好。但是当涉及到将 phone 数字放入输入框时,我得到了 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”方法,而网页将包含同一类型和 class 下的多个元素。与此相关的某些错误,您必须使用“presence_of_all_elements_located”或指定您尝试访问的一个,也许使用 :nth-of-type/child 选择器。此 CSS 选择器在页面上仅出现一次,因此这似乎不会导致问题。

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

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

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

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

错误出现在这一段。我猜错误是由于 class..

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"