获取错误:org.openqa.selenium.WebDriverException:未知错误:密钥应为字符串

时间:2018-06-30 18:00:24

标签: java selenium user-interface testing

我在从Selenium UI中的属性文件访问数据时遇到错误:如何解决?

org.openqa.selenium.WebDriverException: unknown error: keys should be a string.

我有以下框架。我为了自己而轻松地做到了,看起来让自己复杂化了。如果有更好的主意,请提出建议。 感谢所有建议。

框架包含以下内容:
1. 配置属性文件
2. 实用程序类
3. 页面元素定义类文件
4. 可重用函数类文件
5. 测试班

config.properties文件具有以下内容:

url=http://some.com
Email=someuser
Password=somepassword

实用工具类(BrowserCalls)以下代码:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class BrowserCalls {

    public WebDriver driver;
    public Properties configs = new Properties();
    public String pathToProperties = "path to config.properties file";

    public void invokeChromeBrowser() throws IOException {

        FileInputStream input = new FileInputStream(pathToProperties);
        pmsConfigs.load(input);
        System.setProperty("webdriver.chrome.driver", configs.getProperty("chromepath"));
        driver = new ChromeDriver();
        getAndMazimize();

    }

    private void getAndMazimize(){

        driver.get(configs.getProperty("url"));
        driver.manage().window().maximize();

    }


    public void closeChromeBrowser(){

        if(driver != null){

            driver.close();
        }

    }


}

页面元素定义类文件具有以下代码:

import org.openqa.selenium.By;

public class LoginPageElements {


    //Login page elements
    public static By element1 = By.xpath("/html/head/link[1]");
    public static By username = By.xpath("//*[@id=\"login\"]/input/tr1/td1");
    public static By password = By.xpath("//*[@id=\"login\"]/input/tr2/td1");
    public static By submitButton = By.xpath("//*[@id=\"login\"]/input/tr3/td2/button");
    public static By title = By.xpath("/html/head/title");

}

测试用例类将调用的功能定义类:

import com.automation.PageElements.LoginPageElements;
import com.automation.ReusableFunctions.BrowserCalls;

public class LoginFeature extends BrowserCalls {

    public void userLogin(){

        driver.findElement(LoginPageElements.element1);
        driver.findElement(LoginPageElements.username).sendKeys(configs.getProperty(Email));
        driver.findElement(LoginPageElements.password).sendKeys(configs.getProperty(Password));
        driver.findElement(LoginPageElements.submitButton).click();

    }

}

测试用例类如下:

import com.automation.ReusableFunctions.BrowserCalls;
import com.automation.Components.LoginFeature;
import org.testng.annotations.Test;

import java.io.IOException;

public class LoginTestCase1 extends BrowserCalls {

    @Test (description = "Verify application login")
    public void LoginTest() throws IOException {

        LoginFeature login = new LoginFeature();
        login.invokeChromeBrowser();
        login.userLogin();
        login.closeChromeBrowser();

    }

}

4 个答案:

答案 0 :(得分:3)

您可以检查以下两个语句返回的内容:

System.out.println(System.getProperty("Email"));
System.out.println(System.getProperty("Password"));

可能他们正在返回null,这就是为什么您会出错的原因。

尝试一下:

public void userLogin(){
        System.out.println(System.getProperty("Email")); // check statement return
        System.out.println(System.getProperty("Password")); // check statement return

        driver.findElement(LoginPageElements.element1);
        driver.findElement(LoginPageElements.username).sendKeys(configs.getProperty("Email"));
        driver.findElement(LoginPageElements.password).sendKeys(configs.getProperty("Password"));
        driver.findElement(LoginPageElements.submitButton).click();

    }

PS

System.getProperty("key") // should be like this
System.getProperty(key) // not like this

答案 1 :(得分:2)

将这两行更改为:

driver.findElement(LoginPageElements.username).sendKeys(configs.getProperty(Email))
driver.findElement(LoginPageElements.password).sendKeys(configs.getProperty(Password)); 

收件人:

driver.findElement(LoginPageElements.username).sendKeys(configs.getProperty("username"))  
driver.findElement(LoginPageElements.password).sendKeys(configs.getProperty("password"));  

现在谈论建议部分:

此类中存在一个严重的问题: LoginPageElements ,这是由于绝对 xpath 所致。

例如:您正在使用此xpath://*[@id=\"login\"]/input/tr3/td2/button单击提交按钮。

一个很好的选择建议您使用相对xpath之类的东西

//button[text()='Submit']  // This may not work cause you have not shared the HTML for the submit button. Here I am just guessing.

另外一种选择是: sendKeys(Keys.RETURN),当且仅当应用程序支持在提供username后单击 enter password。代码中类似的内容:

driver.findElement(LoginPageElements.password).sendKeys(configs.getProperty("password"+Keys.RETURN));

尽管正如 @Andrei 所建议的那样,如果您非常依赖登录作为测试方法,则应该为提交按钮编写一个相对的xpath或任何其他定位符,而不要使用Keys.RETURN

您所有的xpath都是绝对的,尝试按以下顺序编写定位符:

  1. id
  2. 类名
  3. linkText
  4. partialLinkText
  5. tagName
  6. css选择器
  7. xpath (尝试相对于绝对,而不是相对)

答案 2 :(得分:1)

前一段时间,我在使用属性文件时遇到了麻烦,问题出在行分隔符上,当我使用 Notepad ++ 打开属性文件时,一切看起来都很好,但是当使用<打开文件时,缺少行分隔符strong>记事本。可能会有帮助

答案 3 :(得分:0)

不要在Excel工作表中保存带有Excel图标的Excel表。 使用按钮在Eclipse中保存Excel工作表。 请检查以下图像链接: enter image description here