Selenium 中的并行执行

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

为什么我们需要会话处理?

在测试执行期间,Selenium WebDriver 必须一直与浏览器交互以执行给定的命令。在执行时,也可能在当前执行完成之前,有人在同一台机器和同类型浏览器中启动了另一个脚本的执行。

Session Handling

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

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

如果您检查 Selenium WebDriver 的源代码,您会发现一个名为“sessionId”的变量。每当我们创建一个 WebDriver 对象的新实例时,都会生成一个新的“sessionId”并将其附加到该特定的 Firefox/Chrome/IE Driver ()。

Achieve Session Handling in Selenium WebDriver

因此,此后我们所做的任何操作都只会在此特定的 Firefox 浏览器会话中执行。

Achieve Session Handling in Selenium WebDriver

由于这是内置功能,因此无需显式分配会话 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 guru99 site
    driver.get("https://demo.guru99.com/V4/");
    
    //Second session of WebDriver
    WebDriver driver2 = new FirefoxDriver();
    //Goto guru99 site
    driver2.get("https://demo.guru99.com/V4/");
}
}

如何使用 Selenium 运行并行测试

在某些情况下,您希望同时运行多个测试。

在这种情况下,可以使用“parallel”属性。

Run Parallel Tests with Selenium

suite 标签的 parallel 属性可以接受四个值:

tests 测试 xml 文件中 <test> 标签内的所有测试用例都将并行运行。
classes Java 类中的所有测试用例都将并行运行
methods 所有带有 @Test 注解的方法都将并行执行。
instances 同一实例中的测试用例将并行执行,但两个不同实例的两个方法将在不同线程中运行。

thread-count 属性允许您指定此执行应分配多少个线程。

完整示例:在此示例中,三个测试用例将并行运行并填写 https://demo.guru99.com/ 的登录数据

完整的项目将如下所示:

Run Parallel Tests with Selenium

TestGuru99MultipleSession.java

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class TestGuru99MultipleSession {
    @Test    
    public void executSessionOne(){
            //First session of WebDriver
        System.setProperty("webdriver.chrome.driver","chromedriver.exe");
            WebDriver driver = new ChromeDriver();
            //Goto guru99 site
            driver.get("https://demo.guru99.com/V4/");
            //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("https://demo.guru99.com/V4/");
        //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("https://demo.guru99.com/V4/");
        //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="TestGuru99MultipleSession">
</class>
</classes>
</test>
</suite>

测试用例顺序和依赖性

您可以设置测试用例执行的顺序和依赖性。

假设您有两个测试用例,“testGuru99TC1”和“testGuru99TC2”,并且您希望在“testGuru99TC1”之前执行测试用例“testGuru99TC2”。在这种情况下,我们将使用“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="testGuru">
<classes>
<class name="TestGuru99MultipleSession">
<include value="testGuru99TC1" dependsOnMethods=" testGuru99TC2"/>
<include value="testGuru99TC2"/>
</class>
</classes>
</test>
</suite>

摘要

  • 每当创建 WebDriver 的新实例时,都会创建一个新的 sessionID。
  • 一个会话将绑定到一个特定的浏览器。
  • 使用属性 thread 和 parallel,您可以并行运行脚本。
  • 您可以使用属性 dependency 来设置测试执行的顺序