7

我正在使用 selenium 2 (WebDriver)。

我正在找到一个按钮并单击脚本:

driver.findElement(By.cssSelector("button:contains('Run Query')")); 

或者

driver.findElement(By.cssSelector("css=.gwt-Button:contains('Run Query')")) 

谁的 html 是这样的:

<button type="button" class="gwt-Button" id="ext-gen362">Run Query</ 
button> 

由于 id 是动态生成的,因此我无法使用该 ID。

有没有办法将 cssSelector 与 contains 之类的东西一起使用?这可能吗?

4

6 回答 6

12

你不能用 CSS 选择器来做到这一点,因为:contains()在 CSS 中没有这样的东西。这是一个多年前被放弃的提议。

如果您想通过元素文本进行选择,您将使用 XPath 选择器。就像是

driver.findelement(By.xpath("//button[contains(., 'Run Query']"))

或者

driver.findelement(By.xpath("//[contains(concat('', @class, ''), '.gwt-Button') and contains(., 'Run Query']"))

于 2013-01-30T02:00:45.687 回答
3

另一种选择是使用 jQuery,如果它出现在页面上,例如:

var webElement = ((JavascriptExecutor)driver).executeScript("return jQuery('button:contains(Run Query)')");
于 2013-01-30T09:40:44.420 回答
0

您不能使用包含,而是使用通配符。

driver.findElement(By.cssSelector("button:(*'Run Query'*)")); 
于 2013-10-16T08:35:16.633 回答
0

我在同一条船上,目前使用带有“包含”的 XPath 选择器来查找具有特定文本内容的元素。有些在大表中<td>,有些<td><a>在大表的深处(特定的列,但事先未知的行)。它非常慢(使用 Firefox 20 找到这样的表条目需要 4 到 5 秒),所以我希望使用 CSS 更快。文本通常是单独的(完整的),有时它是我想忽略的路径末尾的文件名。鉴于它是已知列但未知行,并且可能是<td><td><a>(有时在同一张表中)。对于我要查找的文本是完整的(而不是在其他文本的末尾)的大多数情况,相等比较会比 contains() 快得多吗?我认为有一个“开始于”查找,但是否有一个“结束于”查找?我知道使用“id”会更快,但不幸的是,此 HTML 此处没有任何 ID,并且无法添加它们。我正在寻找<tr>包含此文本的内容,以便可以在同一行中找到另一个元素并获取其文本或单击链接。找到一小部分行并检查它们的文本并没有什么坏处,但我想避免单独搜索<td><td><a>如果可能的话。

于 2013-05-30T15:44:53.300 回答
0

单靠 CSS 无法满足您的需求;您无法按文本过滤。您可以使用 js 获取元素的 id,也可以遍历代码中的所有按钮,直到找到具有正确文本的按钮。如果这是在 python 中:

[btn for btn in browser.find_elements_by_css_selector('button')
 if 'Run Query' in btn.text]

您也可以轻松地概括这一点并制作一个辅助函数。

于 2013-01-30T01:36:27.780 回答
-1
driver.findElement("#ext-gen362").Where(webElement => webElement.Text.Contains("Run Query"))
于 2018-04-09T12:00:39.747 回答