如何将String转换为By类型。
以下是我的情景: 以下面的方式将对象标识保存在属性文件中
username=By.id("username")
password=By.id("password")
在应用程序中,我想检索像
这样的值Properties prop=new Properties();
prop.load("above properties file path")
driver.findelement(prop.getProperty("username"))
//在eclipse中,它抱怨说" WebDriver类型中的方法findElement(By)不适用于参数(String)"
有人可以帮助我吗?
我可以使用如下或其他格式,但我想要上述
的解决方案username="//*[@id='username']"
username="username"
driver.findElement(By.xpath(prop.getProperty("username"))
driver.findElement(By.id(prop.getProperty("username"))
答案 0 :(得分:4)
您可以创建一个解析器方法,它将返回所需的定位器对象,如下所示:
public static By locatorParser(String locator) {
By loc = By.id(locator);
if (locator.contains("id"))
loc = By.id(locator.substring(locator.indexOf("\"") + 1,
locator.length() - 2));
else if (locator.contains("name"))
loc = By.name(locator.substring(locator.indexOf("\"") + 1,
locator.length() - 2));
if (locator.contains("xpath"))
loc = By.xpath(locator.substring(locator.indexOf("\"") + 1,
locator.length() - 2));
return loc;
}
可以通过以下方式在代码中调用:
driver.findElement(locatorParser(prop.getProperty("username")));
为id,name,xpath添加了逻辑。您可以修改相同的方法来添加所有可用的定位器。希望这有帮助!
答案 1 :(得分:1)
WebDriver.findElement方法只接受By类型的对象参数。 Property.getProperty方法仅返回String类型的对象。
因此,这可能适合您的需要:
WebElement element = driver.findElement(By.name(prop.getProperty("username")));
您不能将String类型对象强制转换为仅接受By类型对象的方法。当你要求Selenium找到一个字符串"用户名"你必须告诉它不仅仅是字符串的值。
方法By。[方法]选择全部取决于Selenium正在搜索的页面中您要查找的内容。 "用户名和#34;最有可能是"名称" (By.name)或" id" (By.Id)您正在寻找的领域。 By类将搜索精炼到您期望String" username"的位置。成为:名称,身份,标签,班级等。请参阅By class definition。
另外,请注意,因为getProperty方法可能返回null,而By methods抛出IllegalArgumentException,如果你传递一个空字符串。因此,为getProperty提供默认返回值("")通常更安全。
WebElement element = driver.findElement(By.name(prop.getProperty("username", "")));
答案 2 :(得分:0)
您必须在现有代码的上下文中评估整个表达式。您应该使用JEXL或expressionoasis
等框架以下代码使用JEXL
// Create JexlEngine instance
JexlEngine jexl = new JexlEngine();
// Create Expression object for the string
Expression e = jexl.createExpression(prop.getProperty("username"));
// Create a context. You can pass reference to any object you want to use inside the expression
JexlContext jc = new MapContext();
// Now evaluate the expression, getting the result
driver.findElement((By)e.evaluate(jc));
答案 3 :(得分:0)
我认为您正在尝试使用属性文件实现页面对象模型。我建议使用xml文件而不是java属性文件。例如,页面元素的样本xml如下所示。
<Pages>
<LoginPage>
<txtUserName by="id">username</txtUserName>
<txtPassword by="id">password</txtPassword>
</LoginPage>
</Pages>
现在您可以编写方法从xml文件和节点属性中检索节点作为id,xpath等...进一步编写方法以使用xml节点值和属性查找元素。我在我的项目中使用了相同的方法,因为它对我很有用。