从所有元素中获取文本匹配Selenium中的模式

时间:2010-10-15 16:04:49

标签: python selenium selenium-rc

我的网站包含以下格式的元素:

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

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

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

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

4 个答案:

答案 0 :(得分:5)

我会做的是以下技术之一

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 + "]")

或以更有效的方式使用BeautifulSouplxml

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

答案 1 :(得分:3)

使用Selenium 1 API是不可能的,但如果//td[contains(@id, "subject_")]始终存在于生成的ID中,则可以调用使用XPath subject_定位元素的JavaScript。我不确定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_")],然后遍历返回的匹配数组并获取每个元素的文本

答案 2 :(得分:1)

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

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

在编写通知时会自动调用到字符串的转换,但要存储在数组中就很容易。

答案 3 :(得分:0)

在Selenium 2中

我们可以检查

列出subject = driver.findElements(By.xpath(&#34; // td [contains(@id,&#39; subject _&#39;)]&#34;)) int size = subjects.size();