【问题标题】:How can I click on the third element in this list using selenium? I have tried everything and nothing works如何使用硒单击此列表中的第三个元素?我已经尝试了一切,但没有任何效果
【发布时间】:2021-06-08 06:39:13
【问题描述】:

我正在运行一个网络爬虫,但我无法点击第三个元素。我不知道该怎么做,因为我尝试了谷歌搜索并运行了几种类型的代码。

下面是 html 和我的代码的屏幕截图。我需要单击列表中的第三个元素。它在屏幕截图中突出显示。我不确定如何处理 css 和数据绑定

here is the code for max bed options. I also need to get the 2 beds just like we did for min bed options

谢谢!!

【问题讨论】:

  • 欢迎来到 SO!请在您的问题中显示实际代码。 (不是图片)以及相关的 HTML。

标签: selenium screen-scraping


【解决方案1】:

根据图片,以下应该可以工作:

driver.find_element_by_xpath('//span[@id="bedsMinMaxRangeControl"]//li[@data-value="2"]').click()

但我们需要查看整个页面的 HTML 才能给出正确答案。
也不要忘记在那里使用延迟/等待。
UPD
对于新问题,代码将是:

driver.find_element_by_xpath('//span[@id="bedsMinMaxRangeControl"]//ul[contains(@class,"maxBedOptions")]//li[@data-value="2"]').click()

在这里,您还应该使用适当的data-value,其值从 -1 到 3

【讨论】:

  • 这成功了!你怎么知道它是什么 id,那是一个跨度?
  • 我也意识到我需要最大的卧室。如果我重用代码来为每个点击 2 张床,它就不起作用。这是为什么呢?
  • 所以下拉列表有最小床位和最大床位。你给我的代码点击了最小床位并放下了 2 张床位。我希望它也最多点击 2 张床,以便它只返回两间卧室的公寓!
  • 在您的 HTML 中,我看到了 data-value="4"。很简单。
  • 我只是把屏幕截图放在另一个列表中。不会选择4只是把4张床作为我的最低限度吗?我想要做的是至少点击 2 张床然后刮刀去并点击 2 张床以获得最大如果这有意义的话。也非常感谢您的帮助!
【解决方案2】:

您可以将css_selectordata-value 属性一起使用。

locator = ".dropdownContent .minBedOptions li[data-value='2']"
WebDriverWait(driver, 10).until((EC.element_to_be_clickable, (By.CSS_SELECTOR, locator))).click()

我使用了WebDriverWait,所以一定要导入它...

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

【讨论】:

  • 谢谢! webdriverwait 是做什么的?和time.sleep类似吗?
  • webdriverwait 等待,直到满足预期条件。在这里,我们正在等待元素变为可点击。一旦 Selenium 发现满足此条件,它会立即继续流程,而 time.sleep() 只是将硬编码暂停 X 秒。
  • 是的,不建议对 Selenium 使用硬编码的 time.sleep() 延迟,因为它们会导致测试运行更长的时间,而在预期条件下,您会在发现满足的那一刻继续进行
【解决方案3】:

如果它只是一个使用 li 标签的列表,就像从共享快照中看到的那样,您可能可以将最简单的 xpath 编写为:

//li[contains(text(), '2 Beds')]

并像这样使用它:

driver.find_element_by_xpath("//li[contains(text(), '2 Beds')]").click()

或者如果您想将 xpath 与 WebDriverWait 结合使用,请像这样使用它:

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//li[contains(text(), '2 Beds')]")))

导入:

from selenium.webdriver.support import expected_conditions as EC

现在让我们谈谈当我们不想依赖于 XPATH 中的 2 Beds 文本时,因为如果 UI 中的文本发生变化,我们必须在 Selenium-Python 中更改定位器绑定。

一个好的方法是:

  1. 利用data-value属性://li[@data-value = '2']
  2. 利用 ul 和 li 标签://ul[contains(@class, 'minBedOptions')/li[@data-value = '2']]

【讨论】:

  • 这也有效!谢谢!你能多解释一下绑定吗?我尝试复制“2”中的代码。但我遇到了一个错误
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2021-03-16
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2013-07-09
相关资源
最近更新 更多