我做错了什么?

时间:2019-01-21 19:47:30

标签: selenium

我正在硒中练习,对Java或Selenium都不熟悉,但我正在尝试,我编写了以下代码:

System.setProperty("webdriver.chrome.driver","G:\\Programming\\Selenium\\tools\\drivers\\chromedriver_win32\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.ultimateqa.com/simple-html-elements-for-automation/");



Select dropDown = new Select(driver.findElement(By.xpath("//div[@class='et_pb_blurb_description']//select")));

int counter = dropDown.getOptions().size();

    for (int i=0; i<counter; i++){
    String expectedNames [] = {"Volvo","Saab","Opel","Audi"};

    WebElement items = dropDown.getOptions().get(i);
    String actualNames = items.getText();


    boolean isDisplay = dropDown.getOptions().get(i).isDisplayed();

    if (isDisplay){
        Assert.assertEquals(actualNames, expectedNames[0]);
        System.out.println("Item1 Asserted Succesfuly");
    }
    if (isDisplay){
        Assert.assertEquals(actualNames,expectedNames[1]);
        System.out.println("Item2 Asserted Succesfuly");
    }
    if (isDisplay){
        Assert.assertEquals(actualNames,expectedNames[2]);
        System.out.println("Item3 Asserted Succesfuly");
    }
    if (isDisplay){
        Assert.assertEquals(actualNames,expectedNames[3]);
        System.out.println("Item4 Asserted Succesfuly");
    }
}

我期望:
Item1宣称成功
Item2宣称成功
Item3宣称成功
Item4宣称成功

但是我收到了[Saab]的断言错误,但发现了[Volvo],由于某种原因,它无法读取列表中期望名称的元素

2 个答案:

答案 0 :(得分:3)

首先,您的Selenium代码看起来不错。

问题实际上出在您的条件语句的逻辑中:

if (isDisplay){
    Assert.assertEquals(actualNames, expectedNames[0]);
    System.out.println("Item1 Asserted Succesfuly");
}
if (isDisplay){
    Assert.assertEquals(actualNames,expectedNames[1]);
    System.out.println("Item2 Asserted Succesfuly");
}
if (isDisplay){
    Assert.assertEquals(actualNames,expectedNames[2]);
    System.out.println("Item3 Asserted Succesfuly");
}
if (isDisplay){
    Assert.assertEquals(actualNames,expectedNames[3]);
    System.out.println("Item4 Asserted Succesfuly");
}

在循环的每次迭代中,您的代码都会进入所有4条条件语句中(因为isDisplay=true。发生错误是因为您随后断言actualNames是否等于expectedNames[0], expectedNames[1], expectedNames[2], expectedNames[3]

要解决此问题,您只需要使用一条if计数器来遍历列表和数组的1条i语句,这样两个集合中的对应项就是要匹配的项。 / p>

if (isDisplay){
    Assert.assertEquals(actualNames, expectedNames[i]);
    System.out.println("Item"+ i + " Asserted Succesfuly");
}

轻微偏离轨道

对于这个问题,我将走出话题,说一个下拉列表,列表中的每个元素通常都有一个value属性。例如:

<option value=volvo">Volvo</option>
<option value=saab">Saab</option>

一个好的做法是改为使用此value属性,而不要使用可见的文本。 isDisplayed()方法可能会返回false,具体取决于dropdown元素的实现,特别是如果它不是下拉列表的默认值时。 value=volvo属性将始终可供您用来选择元素,只要它出现在DOM中即可。

要做到这一点,很简单:

String expectedNames [] = {"volvo","saab","opel","audi"};
for (int=0; i<count; i++){
    WebElement item = dropDown.getOptions().get(i);
    String attrValue = item.getAttribute("value");

    Assert.assertEquals(attrValue, expectedNames[i]);
    System.out.println("Item " + i " asserted successfully.");
}

当您实际上打算单击以选择另一个选项时,这将对您很方便。硒可能会引发NoSuchElementException错误。

答案 1 :(得分:1)

@Proko请注意,在for循环的第一次迭代之后,它将首先声明是否满足条件,但不会随后断言,因为在下一次迭代中,Saas(数组中的第二个元素)将到来,并且将从getOptions()方法中获取相同的内容,因此您不会需要4个if条件,则1足以声明所有值,除去所有if条件(除第一个条件外),然后将i添加为数组的索引元素。代码供您参考。

if (isDisplay){
        Assert.assertEquals(actualNames, expectedNames[i]);
        System.out.println("Item1 Asserted Succesfuly");
    }