【问题标题】:Selenium Python Find Elements by XPath does not return all expected elementsSelenium Python Find Elements by XPath 不会返回所有预期的元素
【发布时间】:2020-12-15 13:41:33
【问题描述】:

我正在从 HTML 网站上的一系列表格中抓取数据。该网站的表格数量取决于输入,因此我尝试使用:.find_elements_by_xpath("//table") 来简单地获取页面上所有表格元素的列表。

但是,在这种情况下,它只返回页面上的第一个表。当我使用find_element_by_xpath(//table[2]) 时,它会返回另一个表,但使用find_elements 不会。

网站入口是here,点击底部发送即可。 (我正在尝试从结果页面获取数据)。我在 Firefox Webbrowser 上使用 Python 中的 Selenium。

有趣的是,标题表的 XPath 为table[1],这就引出了table[0] 在哪里的问题。

【问题讨论】:

  • 你怎么知道 selenium 不会返回所有元素?请显示代码,因为它应该返回 2 个表。关于 xpath [1] - xpath 中的计数器从 1 开始,而不是 0。所以 [1] 确实是第一个表。并且 //table[0] 不存在 =)
  • 嘿,又打开了这个网站,现在只有一张桌子。
  • 嘿,所以当我运行以下代码时,它只返回一个值 1,而不是预期的 2。 (一个表用于页眉,另一个用于数据表)。 count = driver.find_elements_by_xpath("//table") print(len(count))
  • 您是否尝试在计数之前明确等待?
  • @AmrutaPande 嗨,是的,我在计算之前使用了显式等待。同样,如果我使用 EC. presence_of_element_located(By. XPATH, "//table[2]) 它加载表 2 就好了,但是,EC.presence_of_all_elements_located 找不到其他表

标签: python selenium selenium-webdriver firefox xpath


【解决方案1】:

这里的关键是在导航到新标签之前正确等待。在单击发送后,将打开一个新选项卡。见以下代码:

driver.get('http://imed.med.ucm.es/Tools/rankpep.html')
WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//img[@src='/icons/ig_logo.png']")))

send = driver.find_element_by_xpath("//input[@value='Send']")
driver.execute_script("arguments[0].scrollIntoView();", send)
driver.execute_script("arguments[0].click();", send)

WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2)) #Wait for 2nd tab to open
driver.switch_to.window(driver.window_handles[1])
count = driver.find_elements_by_xpath("//table")
print(len(count))

输出: 因为在新页面上有两个表格,它打印了 2

【讨论】:

  • 嘿,谢谢。奇怪的是,这段代码不适用于 Firefox webdriver,但它激发了我尝试 Chromedriver 的灵感。有点莫名其妙地现在所有代码都可以工作。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多