【问题标题】:Selenium webdriver unable to locate element in a dropdown listSelenium webdriver 无法在下拉列表中找到元素
【发布时间】:2021-05-02 08:49:13
【问题描述】:

我正在尝试单击下拉列表中的元素,Selenium 能够找到并单击使列表出现的按钮,但它似乎无法定位列表本身弹出。我找到了控制列表的 HTML 并尝试了各种 find_element_by 方法,但没有一个能够找到它。

我尝试过使用 Select 模块以及 switch_to_frame(我不确定我做得是否正确),但我一点运气都没有。任何帮助将不胜感激。

编辑: 经过进一步调查,HTML 似乎有些“不正常”。当我从 Chrome 检查器复制 XPATH 时,它给了我 /html/body/div[5]/div/div/ul/li[3]/div/button,但是如果你注意到,第一个 div 元素是 div[5],但是查看 html,只有 4 个 div 元素是子元素的body。此外,当我复制 CSS 选择器时,我得到了 body > div:nth-child(13) > div > div > ul > li:nth-child(3) > div > button,但 body 的子节点总共只有 12 个。更奇怪的是,将这些定位器保持原样并尝试对其进行更正会产生相同的结果,这就是错误。

这是我的代码:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select

browser = webdriver.Chrome()

url = <url>
browser.get(url)

export1 = browser.find_element_by_xpath("//*[@id=\"react-main-content\"]/div[1]/section/div[1]/div[3]/div[2]/div/button")
time.sleep(1)
export1.click()

# This is the element it's unable to locate
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[4]/div/div/ul/li[3]/li/button")))

# Execution never reaches this point
export2 = browser.find_element_by_xpath("/html/body/div[4]/div/div/ul/li[3]/li/button")
export2.click()

这是 HTML(我无法正确格式化,所以这是一个屏幕截图。突出显示的部分是我正在寻找的下拉菜单):

这是打开下拉菜单的网页,并且我试图定位的下拉菜单中的元素突出显示。

【问题讨论】:

  • 点击发生时会发生什么?下拉菜单打开了吗?
  • 确实如此。 export1.click() 打开下拉列表,但 WebDriverWait 函数超时,因为它无法找到元素,即使我可以找到控制它的 HTML。

标签: python html selenium-webdriver


【解决方案1】:

xpath 中似乎有错误。您已经遍历了列表,无需再次执行。试试这个吧。

WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[4]/div/div/ul/li[3]/button")))

【讨论】:

  • 我认为这可能是正确的。不幸的是,我无法测试,因为该网站目前处于维护状态,但是在再次浏览 HTML 并手动找出 XPATH 之后,正确的路径似乎是 /html/body/div[4]/div/div/ul/li[3]/div/button 我不敢相信直接复制 XPATH Chrome 的检查员给了我错误的路径。我将在今天晚些时候进行测试并报告。
  • 不幸的是,这不起作用。尝试了您建议的 xpath 和我怀疑的 xpath,但都没有奏效。这可能与下拉菜单没有以某种方式成为焦点有关吗?我听说,在某些情况下,您需要使用 switch_to_frame 函数,但我不确定我什至会通过那个函数。 . .
【解决方案2】:

我想通了。愚蠢的我假设在一个浏览器窗口中打开的网站的 HTML 将与 Selenium 打开的浏览器窗口中的 HTML 匹配(并且看到我使用同一窗口中的 HTML 来定位其他几个元素,我为什么不呢?) .然而,事实并非如此。

在暂停执行我的程序并在 Selenium 打开的浏览器窗口中检查网站的 HTML 后,我注意到我试图定位的元素的位置不同,因此我从 Selenium 浏览器窗口复制了 XPATH现在问题已经解决了。

【讨论】:

  • 我很高兴您能够解决您的问题,但我觉得有些不对劲。如果您在这两种情况下都使用 chrome,我不希望 HTML 有任何差异。
  • 我和你在一起。我不认为会有,但有。不知道为什么说实话。
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多