我试图用Selenium测试一个复杂的JavaScript接口(使用Python接口,并跨多个浏览器)。我有一些按钮的形式:
<div>My Button</div>
我希望能够搜索基于“我的按钮”(或非大小写敏感,部分匹配,如“我的按钮”或“按钮”)的按钮。
我发现这非常困难,以至于我觉得我错过了一些明显的东西。到目前为止,我所拥有的最好的东西是:
driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')
但是,这是区分大小写的。我尝试的另一件事是遍历页面上的所有div,并检查元素。文本属性。然而,每次你得到这样的情况:
<div class="outer"><div class="inner">My Button</div></div>
div.outer也有“My Button”作为文本。为了解决这个问题,我尝试查看div.outer是否是div.inner的父元素,但我不知道如何做到这一点(element.get_element_by_xpath('..')返回元素的父元素,但它测试不等于div.outer)。
此外,遍历页面上的所有元素似乎真的很慢,至少使用Chrome web驱动程序是这样。
想法吗?
我在这里问了一个更具体的版本:如何在Selenium WebDriver中获取元素的文本,而不包括子元素文本?
在你提供的HTML中:
<div>My Button</div>
文本My Button是innerHTML,周围没有空格,所以你可以很容易地使用text()如下所示:
my_element = driver.find_element_by_xpath("//div[text()='My Button']")
注意:text()选择上下文节点的所有文本节点子节点
带有前导/尾随空格的文本
如果相关文本在开头包含空格:
<div> My Button</div>
或者在结尾:
<div>My Button </div>
或者在两端:
<div> My Button </div>
在这种情况下,你有两种选择:
You can use contains() function which determines whether the first argument string contains the second argument string and returns boolean true or false as follows:
my_element = driver.find_element_by_xpath("//div[contains(., 'My Button')]")
You can use normalize-space() function which strips leading and trailing white-space from a string, replaces sequences of whitespace characters by a single space, and returns the resulting string as follows:
driver.find_element_by_xpath("//div[normalize-space()='My Button']]")
变量文本的XPath表达式
如果文本是一个变量,你可以使用:
foo= "foo_bar"
my_element = driver.find_element_by_xpath("//div[.='" + foo + "']")