【问题标题】:How to run multiple browser sessions (parallel execution) with Selenium + TestNG using @BeforeSuite annotation如何使用 @BeforeSuite 注释使用 Selenium + TestNG 运行多个浏览器会话(并行执行)
【发布时间】:2018-03-21 07:59:04
【问题描述】:

我可以运行多个 Chrome 浏览器会话 没有 @BeforeSuite 注释,但有时我需要在转到 @BeforeSuite 之前分配一些变量或在 @BeforeClass@BeforeTest 中执行某些操作,并且同时我需要并行启动多个浏览器会话。我怎样才能做到这一点 ?

这是我的代码的简化示例,我使用 @BeforeSuite 分配一些变量,然后从 TestNG.xml 调用 2 个并行测试。它只会调用 1 个测试(而不是 2 个)。

但是,如果我不使用 @BeforeSuite ,它将完全正常工作(2 个测试将并行运行)。

是否可以在运行并行测试的同时仍然使用 @BeforeSuite ?有时我们确实需要在某些测试场景中使用@BeforeSuite 并调用多个浏览器会话。

谢谢。

public class MyClass {
  String baseURL;
  String browser;

  @BeforeSuite
  private void setTheVariables() {
    //Some codes here
    //Some codes here
    this.browser = "chrome";
  }


  @BeforeClass
  private void myBeforeClass() {
    //Some codes here
    //Some codes here
  }


  @BeforeTest
  private void myBeforeClass() {
    //Some codes here
    //Some codes here
  }


  @Test
  @Parameters("baseURL")
  public void f(String baseURL) {

    if (this.browser == "chrome") {
      System.setProperty("webdriver.chrome.driver", "C:\\\\Selenium\\\\chromedriver.exe");
      DesiredCapabilities caps = DesiredCapabilities.chrome();
      LoggingPreferences logPrefs = new LoggingPreferences();
      logPrefs.enable(LogType.BROWSER, Level.ALL);
      caps.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
      WebDriver driver = new ChromeDriver(caps);
      System.out.println("I am going to " + baseURL);
      driver.get(baseURL);
    }
  }
}

这是我的testNG.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="TestSuite" parallel="tests" thread-count="2">



  <test name="Test1" preserve-order="true">
    <parameter name="baseURL" value="http://www.amazon.com" />

    <classes>
      <class name="package.myClass" />
    </classes>
  </test>



  <test name="Test2" preserve-order="true">
    <parameter name="baseURL" value="http://www.google.com" />

    <classes>
      <class name="package.myClass" />
    </classes>

  </test>



</suite>

【问题讨论】:

    标签: java selenium selenium-webdriver testng


    【解决方案1】:

    Beforesuite 带注释的方法在 testNG XML 之前运行。因此,您必须在此顺序下方使用另一个注释,即 BeforeClass 注释来设置您的 java 类中的浏览器类型。在您的 testNG xml 中添加一个名为 browser 的参数以传递浏览器的类型。这将使并行执行成为可能。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    
    <suite name="TestSuite" parallel="tests" thread-count="2">
      <test name="Test1" preserve-order="true">
        <parameter name="baseURL" value="http://www.amazon.com" />
        <parameter name="browser" value="chrome">
        <classes>
          <class name="package.myClass" />
        </classes>
      </test>
      <test name="Test2" preserve-order="true">
        <parameter name="baseURL" value="http://www.google.com" />
        <parameter name="browser" value="firefox">
        <classes>
          <class name="package.myClass" />
        </classes>
      </test>
    </suite>
    

    【讨论】:

      【解决方案2】:

      您可以在.xml文件中通过Browser值传递,而不是在Java类文件中传递它,并且可以通过.java文件处理执行。

      示例:
      <parameter name="myBrowser" value="firefox"/>         <parameter name="myBrowser" value="chrome"/> 它可以在任何它喜欢的地方实现,在 Suite/Class/Test/Method 之前

      @Parameters("parameter name")
      @BeforeTest 
      public void xyz(String myBrowser) throws MalformedURLException {
          if (myBrowser.equalsIgnoreCase("chrome")) {
              System.setProperty("webdriver.chrome.driver", driverpathofchrome);
              driver = new ChromeDriver();
          } else if (myBrowser.equals("firefox")) {
              System.setProperty("webdriver.gecko.driver", driverpathoffirefox);
              driver = new FirefoxDriver();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 2019-10-12
        • 2011-11-10
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        相关资源
        最近更新 更多