如何将字符串转换为By类型

时间:2014-08-02 14:54:29

标签: java selenium selenium-webdriver

如何将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"))

4 个答案:

答案 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)

您必须在现有代码的上下文中评估整个表达式。您应该使用JEXLexpressionoasis

等框架

以下代码使用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节点值和属性查找元素。我在我的项目中使用了相同的方法,因为它对我很有用。