【问题标题】:How to make TestNG open one browser at a time如何让TestNG一次打开一个浏览器
【发布时间】:2018-07-25 08:50:33
【问题描述】:

大家好,我有一个 TestNG 测试套件,它按顺序执行测试。但在它开始运行测试之前。它打开所需数量的浏览器,然后一个接一个地运行测试。我想更改此行为以打开一个浏览器,运行 test/s 并关闭浏览器。之后打开另一个浏览器,运行 test/s 并关闭等等。这可能吗?

我在 IntelliJ 上使用 TestNG、JAVA。示例测试套件:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite1" verbose="1" parallel="false" preserve-order="true" thread-count="1">
    <test name="something1" group-by-instances="true">
        <classes>
            <class name="com.this.is.First"/>
        </classes>
    </test>
    <test name="something2" group-by-instances="true">
        <classes>
            <class name="com.this.is.Second"/>
        </classes>
    </test>
    <test name="something3" group-by-instances="true">
        <classes>
            <class name="com.this.is.Third"/>
        </classes>
</suite>

所有测试都继承了 Main 类,该类具有 @BeforeClass 和 @AfterClass 方法,我在其中实例化浏览器。

每个类可以有多个测试,有时只有一个。

请求的主类:

public class MainBeforeAfter
{
  protected WebDriver driver;
  protected String testUrl = "someurl";

  public MainBeforeAfter()
  {
    if (System.getProperty("webdriver.chrome.driver") == null)
    {
      System.setProperty("webdriver.chrome.driver", "C:/Drivers/chromedriver_win32/chromedriver.exe");
    }
    if (System.getProperty("test.url") != null)
    {
      testUrl = System.getProperty("test.url");
    }
    System.out.println(System.getProperty("webdriver.chrome.driver"));
    ChromeOptions options = new ChromeOptions();
    options.addArguments("headless");
    options.addArguments("window-size=1200x600");
    driver = new ChromeDriver(options);
    //driver = new ChromeDriver();

  }
  @BeforeClass public void beforeClass() throws InterruptedException
  {
    driver.get(testUrl);
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.manage().window().maximize();
    enterLogin();
  }
  protected void enterLogin()
  {
    driver.findElement(By.name("username")).sendKeys("user");
    driver.findElement(By.name("password")).sendKeys("password");
    driver.findElement(By.name("password")).sendKeys(Keys.ENTER);

  }
  @AfterClass public void afterClass() throws InterruptedException
  {
    driver.close();

    try
    {
      driver.quit();
    }
    catch (Exception e)
    {
      System.out.println("Unable to close browser after login header exception caught: " + e);
    }

  }
}

【问题讨论】:

  • 提供主类代码,有助于发现问题
  • 请在上面找到主类代码。谢谢
  • 你可以按照我提供的答案使用单例类

标签: java selenium testng


【解决方案1】:

试试这样:

这应该可以解决问题,就在标签名称后面的类中

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" preserve-order="true">
    <test name="something1">
        <classes>
            <class name="com.this.is.First"/>
            <class name="com.this.is.Second"/>
            <class name="com.this.is.Third"/>
        </classes>
</suite>

希望对你有帮助,

【讨论】:

  • @PashN 这是已定义问题的正确解决方案。
  • 很高兴我能帮上忙
  • 它仍然先打开所有浏览器然后开始运行测试。我想在测试开始执行而不是一开始就打开浏览器。希望这能让它更清楚。
【解决方案2】:

这里必须使用单例,这样试试

  public class MainBeforeAfter {

         public static WebDriver driver;
         public static  String testUrl = "http://www.urlhere.com";

    public static WebDriver getInstance()
    {
      if (System.getProperty("webdriver.chrome.driver") == null)
      {
        System.setProperty("webdriver.chrome.driver", "E:\\gita_workspace\\GitaProject\\drivers\\chromedriver.exe");
      }
      if (System.getProperty("test.url") != null)
      {
        testUrl = System.getProperty("test.url");
      }
      System.out.println(System.getProperty("webdriver.chrome.driver"));
      ChromeOptions options = new ChromeOptions();
      //options.addArguments("headless");
      options.addArguments("window-size=1200x600");
      return driver = new ChromeDriver(options);

    }
    @BeforeClass 
    public void beforeClass() throws InterruptedException
    {
     driver = MainBeforeAfter.getInstance();
      driver.get(testUrl);
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      driver.manage().window().maximize();
     // enterLogin();
    }
    protected void enterLogin()
    {
      driver.findElement(By.name("username")).sendKeys("user");
      driver.findElement(By.name("password")).sendKeys("password");
      driver.findElement(By.name("password")).sendKeys(Keys.ENTER);

    }
    @AfterClass 
    public void afterClass() throws InterruptedException
    {
      driver.close();

      try
      {
        driver.quit();
      }
      catch (Exception e)
      {
        System.out.println("Unable to close browser after login header exception caught: " + e);
      }

    }

   }

【讨论】:

  • 可以,我刚试过。非常感谢您的帮助。
【解决方案3】:

只需添加

@BeforeMethod

getInstance()方法的注解,修改为:

   @BeforeMethod
   public static WebDriver getInstance() {
    if (System.getProperty("webdriver.chrome.driver") == null) {
        System.setProperty("webdriver.chrome.driver", "E:\\gita_workspace\\GitaProject\\drivers\\chromedriver.exe");
    }
    if (System.getProperty("test.url") != null) {
        testUrl = System.getProperty("test.url");
    }
    System.out.println(System.getProperty("webdriver.chrome.driver"));
    ChromeOptions options = new ChromeOptions();
    // options.addArguments("headless");
    options.addArguments("window-size=1200x600");
    driver = new ChromeDriver(options);
    driver.get(testUrl);
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.manage().window().maximize();
}

如果你愿意,在@BeforeClass 中做其他事情(在这种情况下不需要) 然后在方法下面的类中添加

@AfterMethod
public void tearDown() {
driver.quit();
}

它会一次打开浏览器,然后在执行完成后关闭浏览器。 这将依次发生在所有测试用例中。 驱动程序每次都会被创建,每次测试执行完成时都会被销毁。 我不知道这是否是好方法,但它会解决你的问题:)

如果这对你有用,请告诉我。

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 2014-11-24
    • 2023-04-03
    • 2021-12-01
    • 1970-01-01
    • 2018-01-03
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多