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

3 投票
4 回答
9348 浏览
提问于 2025-04-16 05:33

我有一个网站,上面有一些这样的元素:

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

我想知道怎么用Selenium RC(特别是Python的绑定)来读取这些元素的内容。我看过所有的命令,虽然有很多方法可以找到单个元素,但似乎没有命令可以处理多个匹配的列表。例如,我可以用下面的代码找到一个特定元素的内容:

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

但这个方法假设我已经知道那个元素的id,而我并不知道,因为它是动态生成的。

4 个回答

1

在Selenium中,这种事情肯定是可以做到的,因为在TestPlan中(它使用Selenium和HTMLUnit作为后台),这种功能运行得很好。在这种情况下,简单的TestPlan脚本可能看起来像下面这样。

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

当写一个通知的时候,转换成字符串是自动进行的,但如果要存储到一个数组里,也同样简单。

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

或者为了更高效的方式,可以使用BeautifulSoup或者lxml

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

使用Selenium 1的API是无法做到这一点的,不过你可以调用一个JavaScript脚本来找到元素,使用XPath //td[contains(@id, "subject_")],前提是生成的id中总是包含subject_。我不太确定Selenium的浏览器机器人在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_")],然后遍历返回的匹配数组,获取每个元素的文本内容。

撰写回答