要了解如何并行运行脚本,我们首先要了解
为什么需要会话处理?
在测试执行期间,Selenium WebDriver必须始终与浏览器交互才能执行给定的命令。在执行时,也有可能在当前执行完成之前,其他人开始在相同机器和相同类型的浏览器中执行另一个脚本。

在这种情况下,我们需要一种机制,通过这种机制,两种不同的处理应该相互重叠。这可以使用Selenium中的会话处理来实现。
如何在Selenium WebDriver中实现会话处理?
查看Selenium WebDriver的源代码,会发现一个名为‘sessionId’的变量。每当创建WebDriver对象的新实例时,都会生成一个新的“sessionId”,并将其附加到特定的Firefox/Chrome/IEDriver()中。

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

由于这是内置功能,因此不需要显式分配会话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进行并行测试
在某些情况下,希望同时运行多个测试。 可以使用“并行”属性

Suite标记的parallel属性可以接受4个值:
测试 | <test>标记内的所有测试用例将并行运行 |
---|---|
类 | 类中的所有测试用例将并行运行 |
方法 | 所有带有@Test注释的方法都将并行执行。 |
实例 | 同一实例中的测试用例将并行执行,但两个不同实例的两个方法将在不同的线程中运行。 |
该属性 线程数 允许指定应为此执行分配多少线程。 整个项目将如下所示:

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,可以并行运行脚本。
- 可以使用属性依赖项来设置测试执行的顺序