【问题标题】:Verify list elements by Selenium WebDriver通过 Selenium WebDriver 验证列表元素
【发布时间】:2013-07-18 18:24:49
【问题描述】:
WebElement select = myD.findElement(By.xpath("//*[@id='custfoodtable']/tbody/tr[2]/td/div/select"));
List<WebElement> allOptions = select.findElements(By.tagName("option"));
for (WebElement option : allOptions) {
    System.out.println(String.format("Value is: %s", option.getAttribute("value")));
    option.click();
    Object vaLue = "Gram";
    if (option.getAttribute("value").equals(vaLue)) {
        System.out.println("Pass");
    } else {
        System.out.println("fail");
    }
}

我可以验证列表中的一个元素,但我需要验证下拉列表中的大约 20 个元素,并且我不想使用上述逻辑 20 次。有没有更简单的方法?

【问题讨论】:

  • 打印结果如何?

标签: java selenium


【解决方案1】:

不要使用 for-each 结构。它仅在迭代单个 Iterable / 数组时有用。您需要同时遍历 List&lt;WebElement&gt; 和数组。

// assert that the number of found <option> elements matches the expectations
assertEquals(exp.length, allOptions.size());
// assert that the value of every <option> element equals the expected value
for (int i = 0; i < exp.length; i++) {
    assertEquals(exp[i], allOptions.get(i).getAttribute("value"));
}

在 OP 稍微改变他的问题后编辑:

假设你有一个期望值的数组,你可以这样做:

String[] expected = {"GRAM", "OUNCE", "POUND", "MILLIMETER", "TSP", "TBSP", "FLUID_OUNCE"};
List<WebElement> allOptions = select.findElements(By.tagName("option"));

// make sure you found the right number of elements
if (expected.length != allOptions.size()) {
    System.out.println("fail, wrong number of elements found");
}
// make sure that the value of every <option> element equals the expected value
for (int i = 0; i < expected.length; i++) {
    String optionValue = allOptions.get(i).getAttribute("value");
    if (optionValue.equals(expected[i])) {
        System.out.println("passed on: " + optionValue);
    } else {
        System.out.println("failed on: " + optionValue);
    }
}

这段代码基本上完成了我的第一个代码所做的事情。唯一真正的区别是,现在您是手动完成工作并将结果打印出来。

之前,我使用了来自 JUnit 框架的 Assert 类的 assertEquals() 静态方法。这个框架是编写 Java 测试的事实标准,assertEquals() 方法族是验证程序结果的标准方法。他们确保传递给方法的参数相等,如果不相等,则抛出AssertionError

不管怎样,手动的也可以,没问题。

【讨论】:

  • 感谢大家的回答..但我不知道我是否理解因为我对此很陌生。其实我也试过这个
  • 这段代码应该代替你的 for-each 循环。如果需要,您也可以包括您的打印。也就是说,这应该完全按照需要工作,它应该断言您的 &lt;option&gt; 元素的值。将其复制粘贴到测试中时有问题吗?它是否按预期工作?我添加了 cmets 让你更容易理解代码。
  • 嘿,我只是稍微改变一下我的问题。很抱歉之前的混乱。我只是想看看是否有更简单的方法来验证列表中的所有元素。
  • 感谢您的快速回复..我复制了您的代码,但 exp 给了我错误,我试图创建一个局部变量,但长度显示错误长度无法解析或不是字段。我在您之前的回答中也遇到了同样的问题。我知道我在这里遗漏了一些东西。感谢您的帮助
  • 我对你的第一个答案很好奇..我也试图让它以这种方式工作,但它给了我错误。当我尝试查看它是什么错误时创建方法'assertsEquals()'
【解决方案2】:

你可以这样做:

String[] act = new String[allOptions.length];
int i = 0;
for (WebElement option : allOptions) {
    act[i++] = option.getValue();
}

List<String> expected = Arrays.asList(exp);
List<String> actual = Arrays.asList(act);

Assert.assertNotNull(expected);
Assert.assertNotNull(actual);
Assert.assertTrue(expected.containsAll(actual));
Assert.assertTrue(expected.size() == actual.size());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2014-08-19
    • 2015-05-29
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多