【问题标题】:Can't click on an input element HTML using Selenium for Python无法使用 Selenium for Python 点击​​输入元素 HTML
【发布时间】:2021-03-22 18:40:13
【问题描述】:

我在 Python 上使用 Selenium 时遇到问题。这是整个错误代码:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div/div[3]/div[2]/form[1]/input"}
  (Session info: MicrosoftEdge=89.0.774.57)

这是我要访问的元素:

事实是,当我单击该元素并复制完整的 XPath 时,这就是我所拥有的:

/html/body/div/div[3]/div[2]/form[1]/input

但由于某些原因它不起作用...我几乎尝试了所有方法:名称、值、普通 XPath(顺便说一下是//*[@id="content"]/form[1]/input)

我正在使用 Edge Chromium,我使用 Python 3.9.0,这是我正在使用的代码(在变量 telechargerReleve 之前一切正常:

from selenium import webdriver

driver = webdriver.Edge(executable_path="automation_drivers/msedgedriver.exe")
driver.get("https://login.unice.fr/login?service=https://ent.unice.fr/uPortal/Login")

usernameElement = driver.find_element_by_id("username")
passwordElement = driver.find_element_by_id("password")

usernameElement.send_keys("myUsername")
passwordElement.send_keys("myPassword")

login = driver.find_element_by_name("submit")
login.click()

mesInfos = driver.find_element_by_xpath("/html/body/table[2]/tbody/tr/td[3]/table/tbody/tr[2]/td[3]/a")
mesInfos.click()

intracursus = driver.find_element_by_xpath("/html/body/table[3]/tbody/tr/td[2]/span[2]/a[3]")
intracursus.click()

telechargerReleve = driver.find_element_by_xpath("/html/body/div/div[3]/div[2]/form[1]/input")
telechargerReleve.click()

提前谢谢你, 肉酱。

PS:有些文本可能是法语,所以如果您需要翻译或其他内容,请随时问我!

【问题讨论】:

  • 使用更有针对性的 XPATH。也许通过按钮的文本。 (这也是用户会发现它的方式......)似乎它是第一种形式......但基于路径的xpath很脆弱。根据网站的工作方式,它可能还需要 webdriverwait...
  • 所有基于 xpath 的定位器都不脆弱。这是一个谬误。但是有些 xpath 可能很脆弱。
  • 假设您想要在 HTML 中突出显示的元素,您应该使用按名称查找元素。它可以使用。让自己更轻松
  • 您似乎在找到该元素之前单击了一个标签。使用等待。
  • 对 HTML 的任何更改(开发或 Javascript 更新)都可以更改您的 web 元素的路径。由于您在那里使用的是纯基于路径的 XPATH,因此它很脆弱。您最终可能会使用另一个 web 元素,因为您想要的路径已更改。所以它不仅脆弱而且不针对 DOM 的特定元素,而是可以随着更新而改变的路径。

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


【解决方案1】:

好的,所以我弄清楚了问题所在。该网站在 HTML 中为按钮使用了iframe 标记,这显然是我无法单击它的主要原因。我在我的代码中编辑的是我替换为的最后两行:

seq = driver.find_elements_by_tag_name('iframe')

for index in range(len(seq)):   
    driver.switch_to_default_content()
    iframe = driver.find_elements_by_tag_name('iframe')[index]
    driver.switch_to.frame(iframe)
    try:
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME,"telrelevepresences"))).click()
    except TimeoutException:
        pass

谢谢大家的回答!

【讨论】:

    【解决方案2】:

    点击 a 标签后引发等待。

    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME,"telrelevepresences"))).click()
    

    导入

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      相关资源
      最近更新 更多