Java 如何将字符串转换为按类型

Java 如何将字符串转换为按类型,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,如何按类型将字符串转换为 以下是我的设想: 按以下方式在属性文件中保留对象标识 username=By.id("username") password=By.id("password") 在应用程序中,我希望检索如下值 Properties prop=new Properties(); prop.load("above properties file path") driver.findelement(prop.getProperty(“username”))//在eclipse中,它抱怨说

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

以下是我的设想: 按以下方式在属性文件中保留对象标识

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)方法不适用于参数(字符串)”

有人能帮我吗

我可以使用下面的格式或其他格式,但我想解决上述问题

username="//*[@id='username']"
username="username"
driver.findElement(By.xpath(prop.getProperty("username"))
driver.findElement(By.id(prop.getProperty("username"))
该方法只接受By类型的对象参数。 该方法仅返回字符串类型的对象

因此,这可能适合您的需要:

WebElement element = driver.findElement(By.name(prop.getProperty("username")));
不能将字符串类型的对象强制到只接受By类型对象的方法中。当您要求Selenium查找字符串“username”时,您必须告诉它的不仅仅是字符串的值

您选择的方法依据。[方法]完全取决于您在Selenium正在搜索的页面中查找的内容。“username”很可能是您要查找的字段的“name”(By.name)或“id”(By.id)。By类将搜索细化到您期望字符串“username”的位置:在名称、id、标记、类等中。请参阅

另外,要小心,因为getProperty方法可能返回null,如果传递null字符串,with将抛出IllegalArgumentException。因此,为getProperty提供默认返回值(“”)通常更安全

WebElement element = driver.findElement(By.name(prop.getProperty("username", "")));
该方法只接受By类型的对象参数。 该方法仅返回字符串类型的对象

因此,这可能适合您的需要:

WebElement element = driver.findElement(By.name(prop.getProperty("username")));
不能将字符串类型的对象强制到只接受By类型对象的方法中。当您要求Selenium查找字符串“username”时,您必须告诉它的不仅仅是字符串的值

您选择的方法依据。[方法]完全取决于您在Selenium正在搜索的页面中查找的内容。“username”很可能是您要查找的字段的“name”(By.name)或“id”(By.id)。By类将搜索细化到您期望字符串“username”的位置:在名称、id、标记、类等中。请参阅

另外,要小心,因为getProperty方法可能返回null,如果传递null字符串,with将抛出IllegalArgumentException。因此,为getProperty提供默认返回值(“”)通常更安全

WebElement element = driver.findElement(By.name(prop.getProperty("username", "")));

必须在现有代码的上下文中计算整个表达式。您应该使用诸如或之类的框架

下面的代码使用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)); 

必须在现有代码的上下文中计算整个表达式。您应该使用诸如或之类的框架

下面的代码使用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)); 

您可以创建一个解析器方法,该方法将返回所需的定位器对象,如下所示:

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、名称和xpath的逻辑。可以修改相同的方法以添加所有可用的定位器。希望这有帮助

您可以创建一个解析器方法,该方法将返回所需的定位器对象,如下所示:

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、名称和xpath的逻辑。可以修改相同的方法以添加所有可用的定位器。希望这有帮助

我认为您正在尝试使用属性文件实现页面对象模型。我在这里建议使用xml文件而不是java属性文件。例如,页面元素的示例xml如下所示

<Pages>
<LoginPage>
    <txtUserName by="id">username</txtUserName>
    <txtPassword by="id">password</txtPassword>
</LoginPage>
</Pages>

用户名
密码

现在您可以编写方法从xml文件和节点属性中检索节点,如id、xpath等。。。进一步编写使用xml节点值和属性查找元素的方法。我在我的项目中使用了相同的方法,因为它对我非常有用。

我认为您正在尝试使用属性文件实现页面对象模型。我在这里建议使用xml文件而不是java属性文件。例如,页面元素的示例xml如下所示

<Pages>
<LoginPage>
    <txtUserName by="id">username</txtUserName>
    <txtPassword by="id">password</txtPassword>
</LoginPage>
</Pages>

用户名
密码

现在您可以编写方法从xml文件和节点属性中检索节点,如id、xpath等。。。进一步编写使用xml节点值和属性查找元素的方法。我在我的项目中使用了相同的方法,因为它对我非常有用。

感谢您的投入。我知道如何使用,但我正在四处寻找如何实现我的场景。我环顾四周的原因是,比如今天我用name By.name(“username”)标识了一个对象,但是name属性发生了更改,如果我想使用xpath,那么这就是问题所在。所以我想把enter By.xxx作为参数传递给findelement。我希望你理解我的方法。谢谢你的投入。我知道如何使用,但我正在四处寻找如何实现我的场景。我环顾四周的原因是,比如今天我用name By.name(“username”)标识了一个对象,但是name属性发生了更改,如果我想使用xpath,那么这就是问题所在。所以我想把enter By.xxx作为参数传递给findelement。我希望你能理解我的方法。你能分享一段代码来解析上面的XML内容吗?你能分享一段代码来解析上面的XML内容吗