Selenium / getElements由XPATH和CONTAINS(JAVA)

时间:2016-09-02 10:07:34

标签: java selenium xpath contains elements

我有一个包含动态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);
}

3 个答案:

答案 0 :(得分:1)

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

您注释掉的行: -

  

我有一个空指针异常......我再次检查这个,也许我是一个idot

您正在获得NullPointerException,因为您首先将webElements变量初始化为null,这是错误的。

您应该更改此行: -

List<WebElement> webElements = null;

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

答案 1 :(得分:0)

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

&#13;
&#13;
a[id*=contentDataTable][id*=startMenu]
a[id*=contentDataTable]
&#13;
&#13;
&#13;

这个选择器的作用是: - 查找具有包含contentDataTable的id的<a>元素 - 对于相同的元素,我们可以添加另一个id应该包含startMenu

的条件

如果我们使用空格,例如:div a [id * = contentDataTable]将意味着找到一个元素<a>,其id包含contentDataTable,但此元素应该在div中。

你可以做的另一件事是删除&#34;:&#34;从您的xpath,看看这是否是错误的问题。

css选择器在w3schools上得到了很好的解释,你会看到有一个基本选择器很少的表,你应该阅读它们以便更好地理解。

请检查w3schools css selectors

答案 2 :(得分:0)

如果它没有获得你需要的元素,那么页面上可能还有一些适合xpath的元素。你可以改善你的xpath;

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