【问题标题】:Python + Selenium --How to find a dynamic elementPython + Selenium --如何找到动态元素
【发布时间】:2018-12-29 02:47:53
【问题描述】:

我是 Selenium 的新手。我正在尝试单击一个元素,HTML 结构如下所示:

<label>
     <span> text </span>
</label>

我需要单击&lt;span&gt; 下的“文本”,这整个内容都在另一个 span/div/body 等内部,我正在尝试使其动态化,以便我也可以使用不同的文本来定位它。

我正在使用下面的代码:

[...]
vote = input("Which option should I vote for you? :  ")
option = "//label/span[contains(.,'" + vote + "')]\""
option = str(option)
[...]
browser.find_element_by_xpath(option).click()

【问题讨论】:

  • 你能给我们看看代码吗?
  • 没什么可展示的...我试过了:[...] vote = input("我应该给你投票哪个选项?:") option = "//label/span[ contains(.,'" + vote + "')]\"" option = str(option) [...] browser.find_element_by_xpath(option).click()
  • xpath 中\" 的用途是什么?
  • 哦,我明白了你的意思,我认为这就是 "如何在 python 中的字符串中......对吧?
  • 你试过在你的代码中添加等待吗?元素可以由JS动态生成。

标签: python selenium selenium-webdriver xpath webdriver


【解决方案1】:

您可以使用 CSS 选择器,但是在不知道 DOM 其余部分的结构的情况下,这可能不够独特,无法可靠地抓取您想要的元素:

find_element_by_css_selector("label span")

【讨论】:

  • 我想做这样的词每次都可以不一样。
  • 我试图做的是点击一个民意调查的选项之一,但是选择的时间会有所不同,每个答案都在类似的
【解决方案2】:

额外的双引号使您的 xpath 无效 - 这里的这个,转义的:

 "')]\""

option 字符串被构造时,xpath 结束

//label/span[contains(.,'text')]"

,最后的 " 正在破坏它。

放下它,你会好起来的:

option = "//label/span[contains(.,'" + vote + "')]"

您不必将option 转换为字符串 - 它已经属于这种类型。此外,这种字符串构造方式 - 使用字符串格式化 - 更“pythonic”:

option = "//label/span[contains(.,'{}')]".format(vote)

【讨论】:

    【解决方案3】:

    要点击动态元素,您可以使用以下解决方案:

    vote = input("Which option should I vote for you? :  ")
    browser.find_element_by_xpath("//label/span[normalize-space()='" + vote + "']").click()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2018-11-07
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多