我正在硒中练习,对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],由于某种原因,它无法读取列表中期望名称的元素
答案 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");
}