文本为“新建”的按钮的 Xpath

2022-09-01 11:22:07

在我们的应用程序中,几乎在每个屏幕中,我们都有一个带有文本“新建”的按钮,这是其中一个按钮的html源代码:

<button id="defaultOverviewTable:j_id54" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only ui-state-hover" type="submit" name="defaultOverviewTable:j_id54" role="button" aria-disabled="false">
    <span class="ui-button-text ui-c">New</span>
</button>

我尝试使用以下语句单击按钮:

driver.findElement(By.xpath("//button[[@type, 'submit'] and [text()='New']]")).click();

但这不起作用

org.openqa.selenium.InvalidSelectorException: The given selector //button[[@type= 'submit'] and [text()='New']] is either invalid or does not result in a WebElement.

目前,我正在使用以下代码单击按钮:

List<WebElement> allButt = driver.findElements(By.tagName("button"));
for (WebElement w : allButt)
{
    if (w.getText().matches("New"))
    {
        w.click();
        break;
    }
}

因为我在页面中有近150个按钮。还有其他方法吗?


答案 1

你的 xpath 语法是错误的 - 你不需要内部的方括号集 - 但即使你修复了这个问题:

//button[@type, 'submit' and text()='New']

它不会选择你想要它做什么。问题是“New”不是直接包含在按钮元素中的文本,而是包含在子 span 元素中。如果只是使用,那么您可以检查元素的整个字符串值(任何级别的所有后代文本节点的串联)text().

//button[@type='submit' and contains(., 'New')]

或者检查而不是:spantext()

//button[@type='submit' and span='New']

(包含值为“新建”的跨度的提交按钮)


答案 2

请尝试以下 xpath:

//button[@type='submit']/span[.='New']

演示

http://www.xpathtester.com/xpath/ff393b48183ee3f373d4ca5f539bedf2


编辑

根据@Ian Roberts 的评论,如果单击按钮元素很重要,则可以改用以下 xpath 表达式:

//button[@type='submit']/span[.='New']/..

推荐