在发布期间的应用程序中,我被迫将id
更改为xpath
或class
名称或标签。所以我不能使用任何元素选择方法,如 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;
}