【问题标题】:Get Text From All Elements Matching a Pattern in Selenium从与 Selenium 中的模式匹配的所有元素中获取文本
【发布时间】:2011-04-26 00:46:33
【问题描述】:

我有一个包含表单元素的网站:

<td id="subject_23432423">content I want to read</td>

如何使用 Selenium RC(特别是 Python 绑定)从所有这些元素中读取内容?我已经浏览了所有命令,虽然有很多选项可以找到单个元素,但似乎没有一个命令可以处理多个匹配项的列表。例如,我可以使用以下命令查找特定元素的内容:

content = sel.get_text("td[@id='subject_23432423']")

但这假设我已经知道 id,我不知道,因为它是动态生成的。

【问题讨论】:

    标签: python selenium selenium-rc


    【解决方案1】:

    我会做的是以下技术之一

    count = sel.get_xpath_count("xpath=//td[starts-with(@id,'subject_')]")
    someArray = []
    for i in count:
      someArray[i] = sel.get_text("xpath=//td[starts-with(@id,'subject_')][" + i + "]")
    

    或者为了更有效地使用BeautifulSoup或lxml

    html = sel.get_html_source()
    from BeautifulSoup import BeautifulSoup
    soup = BeautifulSoup(html)
    #use beautifulsoup to do what you want
    

    【讨论】:

      【解决方案2】:

      使用 Selenium 1 API 是不可能的,但是如果 subject_ 始终存在于生成的 id 中,您可以调用 JavaScript 来使用 XPath //td[contains(@id, "subject_")] 定位元素。我不确定 Selenium browserbot 是否为 IE 提供 XPath 支持,因此您可能仅限于具有本机支持的浏览器。在 Firefox 中它将是:

      var tds = document.evaluate("//td[contains(@id, \"subject_\")]", document, null,
              XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
      for ( var i = 0; i < tds.snapshotLength; i++) {
         var td = tds.snapshotItem(i);
         // get text using td.textContent and add it to array or whatever...
         // and return it
      }
      
      return ...
      

      您需要在代码中将此脚本声明为字符串并通过 selenium.getEval 执行

      但是,如果您能够切换到Selenium 2 (WebDriver),则可以使用它的 API。您将需要使用 findElementsBy 传递 XPath //td[contains(@id, "subject_")],然后遍历返回的匹配数组并获取每个元素的文本

      【讨论】:

      • 谢谢。我发现的另一个解决方案是通过 sel.get_eval("this.browserbot.getCurrentWindow().document.getElementById('parentElementId').innerHTML") 检索父容器的 HTML。从那里我只是在 Python 中运行我的正则表达式。
      【解决方案3】:

      这在 Selenium 中肯定是可能的,因为这种类型的东西在 TestPlan 中运行良好(它使用 Selenium 和 HTMLUnit 作为后端)。在这种情况下,简单的 TestPlan 脚本可能如下所示。

      for %Element% in (response //td[starts-with(@id,'subject_')])
        Notice %Element%
      end
      

      在写通知时会自动调用到字符串的转换,但是存储在数组中同样简单。

      【讨论】:

        【解决方案4】:

        在硒 2 中

        我们可以检查

        列出主题 = driver.findElements(By.xpath("//td[contains(@id, 'subject_')]")) int size = subject.size();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-18
          • 2021-04-19
          • 2012-05-30
          • 2020-10-26
          • 2015-02-09
          • 1970-01-01
          相关资源
          最近更新 更多