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

Python 从与Selenium中的模式匹配的所有元素中获取文本,python,selenium,selenium-rc,Python,Selenium,Selenium Rc,我有一个包含以下表单元素的网站: <td id="subject_23432423">content I want to read</td> 但这假设我已经知道id,我不知道,因为它是动态生成的。使用Selenium 1 API是不可能的,但是您可以调用JavaScript,使用XPath/td[contains(@id,“subject”)]如果生成的id中始终存在主题。我不确定Selenium browserbot是否为IE提供XPath支持,因此您可能会将我限制在

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

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

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

使用Selenium 1 API是不可能的,但是您可以调用JavaScript,使用XPath
/td[contains(@id,“subject”)]
如果生成的id中始终存在
主题
。我不确定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 ...
var tds=document.evaluate(//td[contains(@id,\“subject\”),document,null,
XPathResult.ORDERED_节点_快照_类型,null);
对于(变量i=0;i
您需要在代码中将此脚本声明为字符串,并通过selenium.getEval执行


但是,如果您能够切换到,则可以使用其API。您需要使用
findElementsBy
传递XPath
//td[contains(@id,“subject”)]
,然后遍历返回的匹配数组并获取每个元素的文本,我将使用以下技术之一

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 + "]")
或更有效地使用或


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

for %Element% in (response //td[starts-with(@id,'subject_')])
  Notice %Element%
end
在编写通知时,会自动调用到字符串的转换,但要将其存储在数组中也很容易。

在Selenium 2中

我们可以查一下

List subjects=driver.findElements(By.xpath(//td[contains(@id,'subject')]))
int size=subjects.size()

谢谢。我发现的另一个解决方案是通过sel.get_eval(“this.browserbot.getCurrentWindow().document.getElementById('parentElementId').innerHTML”)检索父容器的HTML。从那里,我用Python运行我的正则表达式。
html = sel.get_html_source()
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
#use beautifulsoup to do what you want
for %Element% in (response //td[starts-with(@id,'subject_')])
  Notice %Element%
end