Selenium中的并行执行:会话处理和测试依赖

要了解如何并行运行脚本,我们首先要了解

为什么需要会话处理?

在测试执行期间,Selenium WebDriver必须始终与浏览器交互才能执行给定的命令。在执行时,也有可能在当前执行完成之前,其他人开始在相同机器和相同类型的浏览器中执行另一个脚本。

Parallel Execution & Session Handling in Selenium
Parallel Execution & Session Handling in Selenium

在这种情况下,我们需要一种机制,通过这种机制,两种不同的处理应该相互重叠。这可以使用Selenium中的会话处理来实现。

如何在Selenium WebDriver中实现会话处理?

查看Selenium WebDriver的源代码,会发现一个名为‘sessionId’的变量。每当创建WebDriver对象的新实例时,都会生成一个新的“sessionId”,并将其附加到特定的Firefox/Chrome/IEDriver()中。

Parallel Execution & Session Handling in Selenium
Parallel Execution & Session Handling in Selenium

在此之后所做的任何操作都将仅在该特定的Firefox浏览器会话中执行。

Parallel Execution & Session Handling in Selenium
Parallel Execution & Session Handling in Selenium

由于这是内置功能,因此不需要显式分配会话ID。

代码示例: 这里将为两个不同的WebDriver生成两个不同的会话。

 import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class SessionHandling {
    public static void main(String...strings ) {
        //First session of WebDriver
        WebDriver driver = new FirefoxDriver();
        //Goto itxiaonv site
        driver.get("http://www.itxiaonv.com/");
        //Second session of WebDriver
        WebDriver driver2 = new FirefoxDriver();
        //Goto itxiaonv site
        driver2.get("http://www.itxiaonv.com/");
    }
}
 

如何使用Selenium进行并行测试

在某些情况下,希望同时运行多个测试。 可以使用“并行”属性

Parallel Execution & Session Handling in Selenium
Parallel Execution & Session Handling in Selenium

Suite标记的parallel属性可以接受4个值:

测试 <test>标记内的所有测试用例将并行运行
类中的所有测试用例将并行运行
方法 所有带有@Test注释的方法都将并行执行。
实例 同一实例中的测试用例将并行执行,但两个不同实例的两个方法将在不同的线程中运行。

该属性 线程数 允许指定应为此执行分配多少线程。 整个项目将如下所示:

Parallel Execution & Session Handling in Selenium
Parallel Execution & Session Handling in Selenium

TestMultipleSession.java

 import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class TestMultipleSession {
    @Test
    public void executSessionOne() {
        //First session of WebDriver
        System.setProperty("webdriver.chrome.driver","chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        //Goto itxiaonv site
        driver.get("http://www.itxiaonv.com/");
        //find user name text box and fill it
        driver.findElement(By.name("uid")).sendKeys("Driver 1");
    }
    @Test
    public void executeSessionTwo() {
        //Second session of WebDriver
        System.setProperty("webdriver.chrome.driver","chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        //Goto guru99 site
        driver.get("http://www.itxiaonv.com/");
        //find user name text box and fill it
        driver.findElement(By.name("uid")).sendKeys("Driver 2");
    }
    @Test
    public void executSessionThree() {
        //Third session of WebDriver
        System.setProperty("webdriver.chrome.driver","chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        //Goto guru99 site
        driver.get("http://www.itxiaonv.com/");
        //find user name text box and fill it
        driver.findElement(By.name("uid")).sendKeys("Driver 3");
    }
}
 

TestNG.XML

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="3" parallel="methods" >
    <test name="testGuru">
        <classes>
            <class name="TestMultipleSession"></class>
        </classes>
    </test>
</suite>
 

测试用例顺序和依赖性

可以设置测试用例的顺序和依赖关系。

假设有两个测试用例,“test99TC1”和“testTC2”,并且想要在“testTC1”之前执行测试用例“testTC2”。在这种情况下,我们将使用“DependsOnMethods”属性来建立依赖关系和执行顺序。

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" thread-count="3" parallel="methods" >
 <test name="testITXiaonv">
  <classes>
   <class name="TestGuru99MultipleSession">
    <include value="testGuru99TC1" dependsOnMethods=" testGuru99TC2"/>
    <include value="testGuru99TC2"/>
  </class>
  </classes>
 </test>
</suite>
 

总结

  • 将为WebDriver的新实例创建一个新的sessionID。
  • 一个会话将与一个特定的浏览器绑定。
  • 使用属性thread和parallel,可以并行运行脚本。
  • 可以使用属性依赖项来设置测试执行的顺序

IT赶路人

专注IT知识分享