如何将当前功能传递给单个测试

时间:2016-06-27 16:04:40

标签: java selenium testng selenium-grid

这可能就像从另一个类获取变量一样简单。我还在学习Java和Selenium。

我希望测试运行报告(ExtentReports)能够以@Test级别(功能)报告浏览器。目前Grid在不同的浏览器上运行相同的测试,报告不区分它们。

使用Selenium Grid,我使用@BeforeMethod定义我的@Test的功能(包括浏览器)。我在我的BaseTest课程中这样做。

public class BaseTest {
@BeforeMethod(alwaysRun = true)
@Parameters({ "platform", "browser", "version" })
public void setup(String platform, String browser, String version)
        throws MalformedURLException, InterruptedException {    
    RemoteWebDriver driver = null;      
    //important: Thread local!
    threadedDriver = new ThreadLocal<RemoteWebDriver>();
    DesiredCapabilities caps = new DesiredCapabilities();
    // Platforms
    if (platform.equalsIgnoreCase("windows"))
        caps.setPlatform(Platform.WINDOWS);
    if (platform.equalsIgnoreCase("XP"))
        caps.setPlatform(Platform.XP);
    if (platform.equalsIgnoreCase("WIN8"))
        caps.setPlatform(Platform.WIN8);
    if (platform.equalsIgnoreCase("WIN8_1"))
        caps.setPlatform(Platform.WIN8_1);
    if (platform.equalsIgnoreCase("ANY"))
        caps.setPlatform(Platform.ANY);
    if (platform.equalsIgnoreCase("MAC"))
        caps.setPlatform(Platform.MAC);
    if (platform.equalsIgnoreCase("Android"))
        caps.setPlatform(Platform.ANDROID);
    // Browsers
    if (browser.equalsIgnoreCase("Internet Explorer"))
        caps.setBrowserName("internet explorer");
    if (browser.equalsIgnoreCase("Firefox"))
        caps.setBrowserName("firefox");
    if (browser.equalsIgnoreCase("chrome"))
        caps.setBrowserName("chrome");
    if (browser.equalsIgnoreCase("MicrosoftEdge"))
        caps.setBrowserName("MicrosoftEdge");
    if (browser.equalsIgnoreCase("iPad"))
        caps.setBrowserName("ipad");
    if (browser.equalsIgnoreCase("iPhone"))
        caps.setBrowserName("iphone");
    if (browser.equalsIgnoreCase("Android"))
        caps.setBrowserName("android");
    // Version
    caps.setVersion(version);
    System.out.println(caps);
    System.out.println(browser);
    //Initialize driver with capabilities
    driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), caps);

    //this uses below methods to set above RemoteWebDriver to the getDriver()
    //method in a threaded instance.
    setWebDriver(driver);
    initialize();

}
}

所以现在我在每个线程Grid测试运行中都有一个browser变量。我需要将变量放入每个@Test方法中。这是我在一个单独的课程中的@Test。在try语句的开头,我想为当前的线程网格测试功能打印browser变量

public class Workflow1 extends BaseTest {
@Test
public void Workflow1TestInvalidPolicyNumbers() throws InterruptedException {
    HomePage homePage = new HomePage(getDriver());
    ExtentTest testReporter = ComplexReportFactory.getTest();
    try {
System.out.println("This is the browser:" + ??(help here)??);
        loginMethod("TestUser","TestPassword");         
        homePage.setFindAPersonOrPolicySearchField("1234");
        homePage.clickSearchButton();
        testReporter.log(LogStatus.INFO, "Searched \"1234\"");
        Thread.sleep(2000);
        if (getDriver().getPageSource().contains("Policy numbers should be 7 or 10 digits long"))
            testReporter.log(LogStatus.PASS, "Policy numbers should be 7 or 10 digits long");
        else 
            testReporter.log(LogStatus.FAIL, "Results incorrect" + testReporter.addScreenCapture(ComplexReportFactory.CaptureScreen(getDriver())));

    } catch (Exception e) {
        testReporter.log(LogStatus.ERROR, "Exception found: " + e.getMessage()
                + testReporter.addScreenCapture(ComplexReportFactory.CaptureScreen(getDriver())));
        System.out.println(e);
    }
}

2 个答案:

答案 0 :(得分:2)

看起来浏览器信息被传递到setup()方法中的BaseTest.java类。

您可以将此数据存储在一个变量中,该变量随后可供所有相关类使用:

public class BaseTest {

protected String browser; // add a property to hold this value

@BeforeMethod(alwaysRun = true)
@Parameters({ "platform", "browser", "version" })
public void setup(String platform, String browser, String version)
        throws MalformedURLException, InterruptedException {   
    this.browser = browser; // store the given browser string
    RemoteWebDriver driver = null;      
    //important: Thread local!
    threadedDriver = new ThreadLocal<RemoteWebDriver>();
    DesiredCapabilities caps = new DesiredCapabilities();
    // Platforms
    if (platform.equalsIgnoreCase("windows"))
        caps.setPlatform(Platform.WINDOWS);

然后BaseTest子类可以直接引用它:

public class Workflow1 extends BaseTest {
@Test
public void Workflow1TestInvalidPolicyNumbers() throws InterruptedException {
    HomePage homePage = new HomePage(getDriver());
    ExtentTest testReporter = ComplexReportFactory.getTest();
    try {
    System.out.println("This is the browser:" + browser); // then retrieve it

答案 1 :(得分:1)

您还可以通过查询RemoteWebDriver对象本身来获取浏览器样式名称和一大堆信息,以通过调用来显示实际功能

getDriver().getCapabilities().getBrowserName()

这样就不需要将浏览器风格作为测试类中的单独数据成员。

有关javadocs的信息,请参阅here

相关问题