【问题标题】:Get specific occurrence Python Selenium获取特定出现的 Python Selenium
【发布时间】:2022-01-23 11:52:27
【问题描述】:

我正在自动化一个网站,它有多个具有相同标题、类别等的搜索框。它通常在每个页面上出现 2 或 3 次。有没有办法告诉 Selenium 只使用第 2 次或第 3 次出现?

我目前有这个:

driver.find_element(By.XPATH, './/*[@title = "Searchbox"]').click()

driver.find_element(By.XPATH, './/*[@title = "Searchbox"]').send_keys(i)

它当前单击第一个搜索框并输入数字 i,但我希望 Selenium 对具有相同 html 的任何其他搜索框执行此操作。

谢谢!

【问题讨论】:

  • 所以每个搜索框总会有一些独特之处,可能是“标签提示”或“文本”等。一旦发现,您将不得不编写自定义 XPath 来访问它们并执行需要采取的行动。
  • 参考这里了解如何编写自定义 Xpath => stackoverflow.com/questions/70776928/…

标签: python selenium web-scraping


【解决方案1】:

理想情况下,您的locator strategy 应该在DOM Tree 中唯一标识每个WebElement

由于您的 Locator Strategy 在每个页面上标识 2 或 3 个元素,您需要构建一个更规范的定位器。但是下面的代码行:

driver.find_element(By.XPATH, './/*[@title = "Searchbox"]')

将始终选择第一个匹配元素。


要点击secondthird匹配的元素,可以使用以下定位器策略

  • 点击第二场比赛:

    driver.find_element(By.XPATH, "(.//*[@title = "Searchbox"])[1]").click()
    
  • 点击第三个:

    driver.find_element(By.XPATH, "(.//*[@title = "Searchbox"])[2]").click()
    

【讨论】:

  • 谢谢!我理解你的逻辑,但你删除了开头的'和和,并用括号替换它们。如果我这样做,我会得到 SyntaxError,如果我将它们结合使用,我会得到 InvalidSelectorException。你知道我做错了什么吗?
  • @Not_a_Robot 错过了双引号,现在添加。让我知道状态。
【解决方案2】:

要使用 xpath 通过其出现来获取某个元素,只需将 xpath 包装在 (<your xpath>)[number] 中,其中 number 是元素出现次数。

点击第二个:

driver.find_element(By.XPATH, '(.//*[@title = "Searchbox"])[2]').click()

【讨论】:

  • 5 小时后,您给出了相同的答案,该答案已被 2 个回答者回答。它为社区增加了什么?
  • @cruisepandey 如果仍然没有任何答案被接受,那么提问的人可能不清楚。我已经改写了答案,我认为它更清楚。这种行为是一种不好的做法吗?没问题,我可以删除这个答案。
  • 不,这不应该是必需的。我只是想知道它背后的思考过程。干杯!
  • @cruisepandey 我同意,你的回答很好,所以我以后会更加小心,对不起。
【解决方案3】:

作为最后的手段,您可以使用 xpath 索引:

如果这个.//*[@title = "Searchbox"]代表1/3 nodes1/2 nodes

您可以简单地将其更改为

(.//*[@title = "Searchbox"])[2] 

并像这样使用它:

driver.find_element(By.XPATH, "(.//*[@title = 'Searchbox'])[2]").send_keys(i)

表示第二个节点

[3]代表第三个节点。

(.//*[@title = "Searchbox"])[3]

等等……

不建议这样做,但可以作为最后的手段。

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多