Selenium / getElements 通过 XPATH 和 CONTAINS (JAVA)

Selenium / getElements By XPATH and CONTAINS (JAVA)

我有一个动态链接列表,其中还有动态 IDsCSS 和所有其他用于获取元素列表的选项都没有用,期望有一种方法。使用 contains()。但是以哪种方式呢?

该列表包含 XPATH 个值,如下所示:

//a[@id='contentDataTable:4711:startMenu']/span
//a[@id='contentDataTable:4712:startMenu']/span
//a[@id='contentDataTable:4713:startMenu']/span
..
//a[@id='contentDataTable:4714:startMenu']/span

我无法使用的匹配项,因为 XPATH 1.0 仅支持 Selenium。所以我正在寻找正确的 contains() 调用...

第一个想法是

xpath=//a[contains(@id, 'contentDataTable:')]

但它不起作用。

我是如何尝试获取元素的:

public List<WebElement> getWebElements(Boolean isDebug, Boolean isHPOMDebug, RemoteWebDriver remWebDriver, String htmlType, String htmlValue, String actField) {
    List<WebElement> webElements = null;
    String           webRequest  = "";

    try {
        switch (htmlType) {
            case "XPATH":
                webRequest  = htmlValue;
                webElements = remWebDriver.findElements(By.xpath(webRequest));
                break;

            case "LINKTEXT":
                webRequest  = htmlValue;
                webElements = remWebDriver.findElements(By.linkText(webRequest));
                break;

            case "LINKTEXTPART":
                webRequest  = htmlValue;
                webElements = remWebDriver.findElements(By.partialLinkText(webRequest));
                break;

            case "CSS":
                webRequest  = htmlValue;
                webElements = remWebDriver.findElements(By.cssSelector(webRequest));
                break;

            case "TAG":
                webRequest  = htmlValue;
                webElements = remWebDriver.findElements(By.tagName(webRequest));
                break;

            case "ID":
                webRequest  = actField;
                webElements = remWebDriver.findElements(By.id(webRequest));
                break;

            case "NAME":
                webRequest  = actField;
                webElements = remWebDriver.findElements(By.name(webRequest));
            break;


            default:
                webElements = null;
        } // END OF INNER SWTICH

        if (isDebug && webElements != null && webElements.size() > 1) {
            logger.log(LogStatus.INFO, "getWebElements: " + webRequest + " FOUND: " + webElements.size());
            for (int i=0;i<webElements.size(); i++) {
                logger.log(LogStatus.INFO, "getWebElements: (" + i + ") TEXT = [" + webElements.get(i).getText()     + "]");
                logger.log(LogStatus.INFO, "getWebElements: (" + i + ") TAG  = [" + webElements.get(i).getTagName()  + "]");
                logger.log(LogStatus.INFO, "getWebElements: (" + i + ") LOC  = [" + webElements.get(i).getLocation() + "]");
            }
            report.flush();
        }

    }
    catch (Exception e) {
        e.printStackTrace();
        webElements = null;
    }

    return(webElements);
}

很容易为此获得一个css选择器。 Css 如果您使用以下选择器之一,应该可以正常工作:

a[id*=contentDataTable][id*=startMenu]
a[id*=contentDataTable]

这个选择器的作用是: - 找到 ID 包含 contentDataTable 的 <a> 元素 - 对于相同的元素,我们可以添加另一个条件,即 id 还应包含 startMenu

如果我们使用 space,例如:div a[id*=contentDataTable] 将意味着找到一个元素 <a>,其 id 包含 contentDataTable,但是此元素应位于 div.

您可以做的另一件事是从您的 xpath 中删除“:”,看看这是否是错误的原因。

Css 选择器在 w3schools 上有很好的解释,你会看到 table 基本选择器很少,你应该阅读它们以更好地理解。

请检查w3schools css selectors

如果它没有获得您需要的元素,那么页面上可能还有一些其他元素适合 xpath。您可以像这样改进您的 xpath;

webDriver.findElements(By.xpath("//a[contains(@id, 'contentDataTable') and contains(@id, 'startMenu')]"))

实际上你的 xpath 是正确的,你的 Java 方法 getWebElements(Boolean isDebug, Boolean isHPOMDebug, RemoteWebDriver remWebDriver, String htmlType, String htmlValue, String actField) 获取元素的代码看起来也不错。

您注释掉的行:-

I got an null pointer exception... I check this again, perhaps I am an idot

你得到 NullPointerException 因为你将第一个 webElements 变量初始化为 null 这是错误的。

你应该改变这一行:-

List<WebElement> webElements = null;

List<WebElement> webElements = new ArrayList<WebElement>();