java - 当我在一个类中有多个测试时,避免 Java Selenium TestNG 超时的最佳方法是什么?

标签 java selenium timeout salesforce testng

我在 Selenium TestNG 的一个类中有多个测试。问题是,几乎每次我在不同的测试或测试的不同步骤中都会遇到超时异常。因此很难捕获导致超时的确切元素。

org.openqa.selenium.ElementNotVisibleException: element not visible
OR
org.openqa.selenium.WebDriverException: unknown error: Element <img data-aura-rendered-by="3:3231;a" src="avatar_96.png" class="profileTrigger branding-user-profile circular" alt="User" title="User"> is not clickable at point (1887, 68). Other element would receive the click: <div class="panel slds-modal slds-modal--large slds-fade-in-open" aria-labelledby="title_1233:319;a" tabindex="-1" role="dialog" aria-modal="true" data-aura-rendered-by="1249:319;a" style="opacity: 1;">...</div>

当我在一个类中有多个测试时,避免 Selenium TestNG 超时的最佳方法是什么? 是否有一些代码我可以放入例如

@BeforeClass or @Beforetest

哪一项适用于类里面的所有测试?

为了更好地理解,我分享我的代码。

 public class BothApprovalCockpitLighting   {

  private static WebDriver driver;
  public static WebDriverWait wd;

  @BeforeTest
  public void setUp()
  {
      System.out.println("*******************");
      System.out.println("launching Chrome browser");
      System.setProperty("webdriver.chrome.driver", "C:\\Drivers\\chromedriver_win32\\chromedriver.exe");
      driver = new ChromeDriver();
      driver.manage().window().maximize();
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);

  }

  @BeforeClass
  public void login() throws Exception
  {
       driver.get("https://test.com/"); 

       wd = new WebDriverWait(driver, 30);
        wd.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='username']")));

        // Enter username in textbox 
        System.out.println("Enter username in textbox"); 
        driver.findElement(By.xpath("//input[@id='username']")).sendKeys("USERNAME" ); //Batcon


        //Enter Password in texbox 
        System.out.println("Enter Password in texbox"); 
        driver.findElement(By.xpath("//input[@id='password']")).sendKeys("PASSWORD");

        //Click on Login button 
        System.out.println("Click on Login button"); 
        driver.findElement(By.xpath("//input[@id='Login']")).click(); 

        System.out.println("Login Sucessfully");
  }

  @Test(priority=1)
  public void test1DontCointainApprovalCockpit() throws Exception
  {

      driver.findElement(By.xpath("//img[@alt='All Tabs']")).click();
      String pageSource = driver.getPageSource();

      boolean b1 = pageSource.contains("Approval");
      boolean b2 = pageSource.contains("Cockpit");


      System.out.println("Page should not cointain - Approval Cockpit. This is a negative test.");
      System.out.println("Page cointain Approval: " + b1);
      System.out.println("Page cointain Cockpit: " + b2);

      if(b1 || b2)
      {
          System.out.println("Test 1 is fail - Page cointain Approval Cockpit.");
      }
      else
      {
          System.out.println("Test 1 is past - Page doesn´t cointain Approval Cockpit.");
      }

      Assert.assertFalse(b1,"Failed test 1 page cointain Approval");
      Assert.assertFalse(b2,"Failed test 1 page cointain Cockpit");


  }

  @Test(priority=2)
  public void test2SwitchCointain() throws Exception
  {
      String actualText1 =  driver.findElement(By.xpath("(//a[contains(text(),'Switch')])[2]")).getAttribute("innerHTML");

      Assert.assertTrue(actualText1.contains("Switch to Lightning Experience"), "Failed test 2 page doesn´t cointain Switch");



  }

  @Test(priority=3)
  public void test3Switch() throws Exception
  {


       driver.findElement(By.xpath("//*[text()[contains(.,'John')]]")).click();
       driver.findElement(By.linkText("Switch")).click();

  }

  @Test(priority=4)
  public void test4FMIRApprovalCokpit() throws Exception
  {
      driver.findElement(By.className("slds-icon-waffle")).click();
      String actualText1 =  driver.findElement(By.xpath("//*[text()[contains(.,'FIR')]]")).getAttribute("innerHTML");



      System.out.println("FIR text: " + actualText1);



      Assert.assertTrue(actualText1.contains("FMIR"), "Failed test 4 page doesn´t cointain FMIR");

  }

  @Test(priority=5)
  public void test4ApprovalCokpit() throws Exception
  {


      String actualText2 =  driver.findElement(By.xpath("//*[text()[contains(.,'Cockpit')]]")).getAttribute("innerHTML"); 


      System.out.println("Cockpit text:" + actualText2);



      Assert.assertTrue(actualText2.contains("Approval Cockpit"), "Failed test 4 page doesn´t cointain Cockpit");



  }


  @Test(priority=6)
  public void test6Link() throws Exception
  {
      driver.findElement(By.xpath("//img[@alt='FIR']")).click();
  }

  @Test(priority=7)
  public void test7backToSalesforce() throws Exception
  {
      Thread.sleep(10000);
      driver.findElement(By.xpath("//img[@alt='User']")).click();
      driver.findElement(By.linkText("Switch to Classic")).click();
  }


  @AfterClass
  public void backToClassic() throws Exception
  {

        //driver.findElement(By.xpath("//img[@alt='User']")).click();
        //driver.findElement(By.linkText("Switch to Classic")).click(); //Not working

  }


  @AfterTest
  public void tearDown()
  {

      if(driver!=null)
      {
          System.out.println("Closing Chrome browser");
          driver.quit();
      }

  }
}

最佳答案

我的建议是实现一个页面对象模型,并有一个抽象 driver.findElement(By) 的方法。

然后,不要直接调用 driver.findElement,而是始终调用抽象它的方法。 例如。

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 abstract class BasePage {
        protected WebDriver driver;
        protected WebDriverWait wait;

        public BasePage(WebDriver driver) {
            this.driver = driver;
            wait = new WebDriverWait(driver, 30);
        }

        public void clickElement(By by) {
            wait.until(ExpectedConditions.elementToBeClickable(by));
            driver.findElement(by).click();
        }
    }

对于网站上的每个页面,都有一个扩展 BasePage 的具体页面。通过 WebDriver 使用 BasePage 进行所有交互,这样您就可以在整个测试过程中更轻松地实现“错误处理”。

关于java - 当我在一个类中有多个测试时,避免 Java Selenium TestNG 超时的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49812273/

相关文章:

sql-server - NHibernate.Exceptions.GenericADOException 代码超时,但数据库超时

c# - Selenium WebDriver 偶尔抛出超时异常

java - Selenium Web 驱动程序无法定位元素

go - 在golang中打开超时的PE文件

java - 注释处理器仅处理最近更改的类

java - 我所有的 JavaFX TextFields 中都有行

java - 在 Java 中从 "2d array"检索值时出现问题

j2se 应用程序的监控和警报

javascript - 单击 Protractor 中的可见按钮?

.net - 对于 .Net 中可能超时的方法,推荐的指南或模式是什么?