我如何处理元素定位器选择类型(xpath或标签或id或类)使用Selenium频繁更改



在发布期间的应用程序中,我被迫将id更改为xpathclass名称或标签。所以我不能使用任何元素选择方法,如 driver.findElement(By.id()).

在下一个构建中,我可能必须对相同的元素位置使用 driver.findElement(By.xpath()) OR driver.findElement(By.name())。这意味着我将不得不访问我编写的每个类文件,并将By.id()修改到相应的选择器。

有没有办法通过参数化或其他方法来解决这个问题来避免这种情况?

提前谢谢。

有类似的问题,所以想出了这个通用方法

 public WebElement getElement(Identifier identifier, String expression) {
        By byElement = null;
        switch (identifier) {
        case xpath: {
            byElement = By.xpath(expression);
            break;
        }
        case id: {
            byElement = By.id(expression);
            break;
        }
        case name: {
            byElement = By.name(expression);
            break;
        }
        case classname: {
            byElement = By.className(expression);
            break;
        }
        case linktext: {
            byElement = By.linkText(expression);
            break;
        }
        case paritallinktext: {
            byElement = By.partialLinkText(expression);
            break;
        }
        case tagname: {
            byElement = By.tagName(expression);
            break;
        }
        }
        WebElement element = driver.findElement(byElement);
        return element;
    }
 public static enum Identifier {
        xpath, id, name, classname, paritallinktext, linktext, tagname
    };

还可以使用属性文件来存储值。喜欢

# login
login.username.identifier=xpath
login.username.expression=//input[@id='userNameText']

在 Java 中你可以写

SeleniumUtil.getElement(prop.getProperty("login.username.identifier"), prop.getProperty("login.username.expression")).click();

因此,您无需更改任何Java代码

您还可以在定位器中使用 key=value 作为在 Selenium 1.0 中看到的良好做法,因此将选择选择器。

因此,您可以有一个通用的 getByLocator 方法,该方法返回 By 类对象,示例代码

public By getByLocator(String locator) {
    By by = null;
    if (locator.startsWith("class=")) {
        by = By.className(locator.replace("class=", "").trim());
    } else if (locator.startsWith("css=")) {
        by = By.cssSelector(locator.replace("css=","").trim());         
    } else if (locator.startsWith("link=")) {
        by = By.linkText(locator.replace("link=", "").trim());
    } else if (locator.startsWith("//") or locator.startsWith("/")) {
        by = By.xpath(locator);
    } else if (locator.startsWith("id=")) {
        by = By.id(locator.replace("id=", ""));
    } else {
        by = By.name(locator.replace("name=", ""));
    }
    return by;
}
在这里,我

利用link=,css=,id=作为一些因素来识别定位器类型,因此我得到了By定位器对象。

它的用法如下

List<WebElement> element = driver.findElements(getByLocator("css= input[type=input]"));

你必须在你的框架上工作。使其更通用。我的代码处理了这个问题。我使用了键和值概念。在我的 .properties 文件中,我已经找到了像

Test_login_user=id||username
Test_login_pass=className||passwd

之后,我的代码获取值并从||中吐出它。在这里,我提到了定位器的类型,如果它的 BY id 然后 id||用户名等

public By extractWebElement(String keyobject){
    if(keyobject.startsWith("name_")){
        currentWebElement = By.name(actualLocator);
    }else if(keyobject.startsWith("xpath_")){
        currentWebElement =By.xpath(actualLocator);
    }else if(keyobject.startsWith("linkText_")){
        currentWebElement =By.linkText(actualLocator);
    }else if(keyobject.startsWith("id_")){
        currentWebElement =By.id(actualLocator);
    }else if(keyobject.startsWith("cssSelector_")){
        currentWebElement =By.cssSelector(actualLocator);
    }else if(keyobject.startsWith("tagName_")){
        currentWebElement =By.tagName(actualLocator);
    }
    return currentWebElement;
}
public String extractActualLocator(String locatorInSheet ){
    int underScoreIndex = locatorInSheet.indexOf('_');
    return locatorInSheet.substring(underScoreIndex+1);
}

现在实际的定位器在"currentWebElement"中,我们可以在我们的方法中使用它。查看我的关键字是如何编写的

public  String enterTextt(By object,String data){
    APP_LOGS.debug("Writing in text box");
    try{
        ***driver.findElement(object).sendKeys(data);***
    }catch(Exception e){
        return Constants.KEYWORD_FAIL+" Unable to write "+e.getMessage();
    }
    return Constants.KEYWORD_PASS;
}

最新更新