使用selenium Webdriver读取JSON文件并使用Java编写JSON文件

时间:2016-06-01 17:52:56

标签: java json selenium

我正在开发自动化框架,我正在寻找excel的替代方案来存储测试数据,元素定位器和页面对象。

因此,我的一位致力于自动化的朋友正在使用json文件来存储所有数据,因为它可以轻松快速地读取和写入数据。此外,它还可以轻松维护。他们使用ruby作为语言。

所以我想知道我们是否可以使用java&硒来实现这个目标?

我已经搜索了谷歌,看起来有一个名为" gson"来自谷歌,但没有一个显示如何使用selenium。

请分享您的想法。

谢谢!

2 个答案:

答案 0 :(得分:0)

我不能说在JSON文件中包含元素定位器,因为我遵循页面对象模型并包含java类中的所有内容。但是,从JSON文件中读取测试数据非常容易。我已经有一段时间了,但是我使用了JSON Simple(我仍然使用它来生成JSON对象/文件),并在文件中做了类似的事情:

protected JSONObject getDataFile(String dataFileName) {
    String dataFilePath = "src/test/resources/";
    JSONObject testObject = null; 

    try {
        FileReader reader = new FileReader(dataFilePath + dataFileName);                        
        JSONParser jsonParser = new JSONParser();
        JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);
        testObject = (JSONObject) jsonObject;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return testObject;
}

拥有JSON对象后,JSON simple提供了一些与它交互并获取值的不同方法。我曾经和Gson玩过一段时间,我觉得这很相似。

我不知道你的数据文件是如何构建的,但是我有一个表示测试用例名称的密钥字符串,该值是一个包含其他键值对的json对象,包含实际数据和我将这些数据提供给TestNG数据提供者。如果这与您的设置类似,我可以共享该代码。

编辑:以下是@DataProvider

使用的方法
public Object[][] getTestScenarios(String dataFileName, String testCaseName) {
    JSONArray testCase = (JSONArray) getDataFile(dataFileName).get(testCaseName);
    List<JSONObject> testScenarioArray = new ArrayList<JSONObject>();

    for (int i = 0; i < testCase.size(); i++) {
         testScenarioArray.add((JSONObject) testCase.get(i));
    }

    Object[][] dataProviderArray = new Object[testScenarioArray.size()][];
    for (int scenario = 0; scenario < testScenarioArray.size(); scenario++) {
        String scenarioName = null;

        if ((String) testScenarioArray.get(scenario).get("scenario") != null) {
            scenarioName = (String) testScenarioArray.get(scenario).get("scenario");
        } else {
            scenarioName = "No scenario name specified";
        };
        dataProviderArray[scenario] = new Object[] { scenarioName, (JSONObject) testScenarioArray.get(scenario) };
    }
    return dataProviderArray;
}

可以删除场景名称的内容,因为我相信我只使用它来记录或报告,如果我没记错的话。我之所以将它作为JSONArray并以这种方式编码,是因为单个测试用例可能会有一个包含多个具有不同数据的场景的数组。不希望测试必须关心有多少场景。

答案 1 :(得分:0)

我从DB读取了一个JSON数组,并从JSON数组中创建了一个JSON对象列表。

该数组如下所示:

[{
    "index": "data",
    "type": "message",
    "sum": 
    {
        "message": "HELLO",
    },
}, {
    "index": "data",
    "type": "message",
    "sum":
    {
        "message": "HELLO123",
    }
}]

它是以STRING形式从DB收集的,但它是一个数组,因为它有SQUARE BRACKETS:[{Json1}, {Json2}]

String data = "ArrayFromDB";
JSONArray jsonArr = new JSONArray(data);
List<String> listJSON = new ArrayList<String>();

for (int i = 0; i < jsonArr.length(); i++)
{
    listSMSJSON.add(jsonArr.getJSONObject(i).getJSONObject("sum").getString("message"));
}

System.out.println(listJSON);

listJSON打印为[HELLO, HELLO123]