当前位置: 首页 > 知识库问答 >
问题:

如何让TestNG一次打开一个浏览器

翁宜年
2023-03-14

大家好,我有一个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>

所有的测试都继承了主类,它有@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);
    }

  }
}

共有3个答案

唐默
2023-03-14

只是加上

@之前的方法

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();
}

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

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

萧无尘
2023-03-14

你必须在这里使用singleton,像这样试试

  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);
      }

    }

   }
颛孙越
2023-03-14

试着这样做:

这应该可以做到这一点,就在标记名后面的类中

<!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>

希望能有所帮助,

 类似资料:
  • 问题内容: 在我安装python 3.6并更新所有文件(conda update –all)之前,我的Jupyter Notebook刚刚停止工作。当我启动它时,只会显示一个空白的浏览器页面。我尝试了所有找到的解决方案,但是它们不起作用。我已删除%USERBLABLA%,清除了缓存和cookie,然后再次卸载并安装它仍然无法正常工作。浏览器控制台显示以下错误: 问题答案: 您应该在Anaconda

  • 我有这个功能文件 方案概要: 给定用户在我的网站上 当用户是管理员或主控编辑器时 3.用户在 /page/页面 4.和用户单击/标题/链接 5.然后用户应该被带到/目标页面/ 对于“给定用户在我的网站上”,我编写了登录详细信息,这将为场景中的每个示例打开新的浏览器。我希望单一浏览器打开并执行所有示例。有人能帮忙吗

  • 全局基类 登录名 } 问题是,当运行此功能时,我得到了下面的错误,我不明白为什么会发生这种情况,因为它在错误的位置上没有给我任何帮助。 未定义步骤:给定I打开Chrome 未定义步骤:浏览网站时 未定义的步骤:然后我使用“user1”和“password1”登录网站

  • Edge:(Mozilla/5.0(Windows NT 6.1;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/83.0.4103.97 Safari/537.36 EDG/83.0.478.45) 其中4个浏览器的共同点是Chrome和Safari关键字接受FireFox,但android上的FireFox在userAgent字符串中显

  • 我试图编写一个函数,它将接收一个“浏览器实例”(我指的是),并打开一个带有特定URL的新选项卡。 这是函数: 返回True(如果URL有效) 如果有人能告诉我我做错了什么,我将非常感激。如果您有其他方法来完成打开新选项卡的任务,这是可以的。顺便说一下,我曾尝试使用:,但没有成功(我没有得到新的选项卡,也没有异常)