我是Selenium Webdriver的新手,并试图学习这个API。我想知道如何在一次测试中有效地使用多个断言。我试图直接使用它,但它增加了我的代码长度,也很难调试。有任何建议如何完成它?
package com.eureqa.scripts;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Phase1 {
public static WebDriver driver;
public static WebDriver driver1;
public void navigation1(WebDriver driver1)
{
boolean result=verifyElementPresent(driver1);
if(result)
{
System.out.println("Element found");
}
else
{
System.out.println("Element not found");
}
driver1.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
boolean result1=assertElementPresent(driver1);
if(result1)
{
System.out.println("Element asserted");
}
else
{
System.out.println("Element not asserted");
driver1.quit();
}
driver1.findElement(By.linkText("Reports")).click();
}
public boolean verifyElementPresent(WebDriver driver1)
{
try{
driver1.findElement(By.id("commonheader:headerForm:projectlist"));
return true;
}catch(Exception ex)
{
return false;
}
}
public boolean assertElementPresent(WebDriver driver1)
{
try{
driver1.findElement(By.linkText("Reports"));
return true;
}catch(Exception ex)
{
return false;
}
}
public static void main(String arr[]) throws InterruptedException
{
WebDriver driver1=LoginObject.driver();
System.out.println("Object Received");
LoginEureqa m=new LoginEureqa();
m.login(driver1);
Phase1 p1=new Phase1();
p1.navigation1(driver1);
System.out.println();
System.out.println("Phase1 executed successf`enter code here`ully");
}
}
答案 0 :(得分:1)
我已经将我的selenium测试与jUnit结合起来,所以我可以使用jUnit内置的断言。它使代码更容易使用。另一种你想要查看Selenium等待方法的方法。
当您考虑测试时,您还应该考虑在发现错误情况后是否确实需要测试继续运行。在您的示例中,测试尝试单击"报告"是否有意义?链接,如果verifyElementPresent和assertElementPresent都失败了?如果您在失败后不需要继续运行测试,那么您的代码将更加简单。
查看您的代码,我可能会重写导航1,例如:
package com.eureqa.scripts;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Phase1 {
public static WebDriver driver;
public static WebDriver driver1;
public void navigation1(WebDriver driver1)
{
WebDriverWait wait = new WebDriverWait(driver, 10);
assertTrue("commonheader:headerForm:projectlist not found",
driver1.findElements(By.id("commonheader:headerForm:projectlist")).size() == 1);
wait.until(ExpectedConditions.elementToBeClickable(By.linkText("Reports"))).click();
}
public static void main(String arr[]) throws InterruptedException
{
WebDriver driver1=LoginObject.driver();
System.out.println("Object Received");
LoginEureqa m=new LoginEureqa();
m.login(driver1);
Phase1 p1=new Phase1();
p1.navigation1(driver1);
System.out.println();
System.out.println("Phase1 executed successf`enter code here`ully");
}
}
现在,这并没有完全重现原始帖子中的内容,因为它会在每一步都失败。如果你想让第一个断言失败但是继续,你可以用try / catch块包围assertTrue,然后显示一个单独的消息。
navigation1中的代码非常简单。它首先尝试查找ID为" commonheader:headerForm:projectlist"如果它没有找到该元素,它将抛出一个测试错误,其中包含" commonheader:headerForm:projectlist not found"的消息。
第二步是等待链接可以点击文字"报告"如果该链接在10秒内没有出现,则会引发错误。
答案 1 :(得分:1)
有时,添加脚本可能需要多个断言。
就像
在这种情况下,您可以按照以下方式处理两条消息:
String alert_Text = driver.switchTo().alert().getText();
String successMessage = "item successfully added.";
String duplicateMessage = "Duplicate item not allowed";
assertTrue(alert_Text.equals(successMessage) || alert_Text.equals(duplicateMessage), "Success or Duplicate both message will be count as successful message");