本文介绍了如何在 TestNg 类之间传递 WebDriver 的单个实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法在网络上的任何地方找到对此的明确答案.

I couldnt find a difinitive answer to this anywhere on the net.

我有多个 TestNg 类来运行测试、BrowserFunctions、登录、搜索、过滤器(测试 Amazon uk 以进行练习).我还有一个 BrowserLauncher 类,它根据浏览器名称和一个 testng.xml 文件返回适当的 webdriver.

I have multiple TestNg classes to run tests, BrowserFunctions, Login, Search, Filter (testing Amazon uk for practice). I also have a BrowserLauncher class that returns the appropriate webdriver based on browser name, and a testng.xml file.

BrowserFunctions.java

BrowserFunctions.java

public class BrowserFunctions {

BrowserLauncher bl = new BrowserLauncher();
WebDriver driver;
StringBuilder sb = new StringBuilder();

@BeforeSuite
public void initialioseBrowser() {
    driver = bl.launchBrowser("Firefox");
}

@Parameters({ "URL" })
@BeforeSuite
public void invokeURL(String URL) {
    driver.get(URL);
}

@AfterSuite
public void closeBrowser() {
    driver.close();
}

登录.java

public class Login {

BrowserLauncher bl = new BrowserLauncher();
WebDriver driver;
StringBuilder sb = new StringBuilder();

@Parameters({ "email", "password" })
@Test
public void logInTest(String email, String passowrd) {
    Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKsignInCTA), "Sign in CTA visible");
    CommonFunctions.clickButton(driver, PageElements.amzUKsignInCTA);
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKEmailField), "Email field visible");
    CommonFunctions.inputToField(driver, PageElements.amzUKEmailField, email);
    Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKPasswordField),
            "Password field visible");
    CommonFunctions.inputToField(driver, PageElements.amzUKPasswordField, passowrd);
    Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKSignInButton),
            "Sign in button visible");
    CommonFunctions.clickButton(driver, PageElements.amzUKSignInButton);
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    Assert.assertEquals(driver.getCurrentUrl(), "https://www.amazon.co.uk/?ref_=nav_ya_signin&");
}

搜索.java

public class Search {

BrowserLauncher bl = new BrowserLauncher();
WebDriver driver;
StringBuilder sb = new StringBuilder();

@Parameters({ "searchTerm" })
@Test
public void searchTest(String searchTerm) {
    Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKSearchField),
            "Search field visible");
    CommonFunctions.inputToField(driver, PageElements.amzUKSearchField, searchTerm);
    Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKSearchButton),
            "Search button visible");
    CommonFunctions.clickButton(driver, PageElements.amzUKSearchButton);
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKResultContainer),
            "Results container visible");
    if (driver.findElements(PageElements.amzUKResultContainer).size() > 0) {
        List<WebElement> resultContainerList = driver.findElements(PageElements.amzUKResultContainer);
        for (WebElement w : resultContainerList) {
            if (w.findElements(PageElements.amzUKResultTitle).size() > 0) {
                if (w.findElement(PageElements.amzUKResultTitle).getText().contains(searchTerm)) {
                } else {
                    sb.append(w.findElement(PageElements.amzUKResultTitle).getText() + " does not contain"
                            + searchTerm + "\n");
                }
            }
            Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKResultImage),
                    "Result image visible");
            if (w.findElements(PageElements.amzUKResultImage).size() > 0) {
            } else {
                sb.append(w.findElement(PageElements.amzUKResultTitle).getText()
                        + " does not contain an image\n");
            }
            Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKResultPrice),
                    "Result price visible");
            if (w.findElements(PageElements.amzUKResultPrice).size() > 0) {
                if (w.findElement(PageElements.amzUKResultPrice).getText().contains("£")) {
                } else {
                    sb.append(w.findElement(PageElements.amzUKResultTitle).getText()
                            + " does not contain a price\n");
                }
            }
        }
    }
    System.out.println("searchTest(" + searchTerm + ") Failures:\n" + sb.toString());
}

过滤器.java公共类过滤器{

Filter.javapublic class Filter {

BrowserLauncher bl = new BrowserLauncher();
WebDriver driver;
StringBuilder sb = new StringBuilder();

@Test
public void filterTest() {
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    List<String> filterOptionsList = new ArrayList<String>();

    sb.append(CommonFunctions.clickButton(driver, PageElements.amzUKFilterSeeMore));

    Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKFilterOptions),
            "Filter options visible");
    for (int i = 0; i < driver.findElements(PageElements.amzUKFilterOptions).size(); i++) {
        filterOptionsList.add(driver.findElements(PageElements.amzUKFilterOptions).get(i).getText());
    }

    for (String s : filterOptionsList) {
        Assert.assertTrue(CommonFunctions.checkVisibility(driver, By.partialLinkText(s)), ""
                + s + " link visible");
        if (driver.findElements(By.partialLinkText(s)).size() > 0) {
            driver.findElement(By.partialLinkText(s)).click();
        }else {
            sb.append("Link " + s + " not visible");
            continue;
        }
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKFilterAnyCategory),
                "\"Any Category\" button visible");
        CommonFunctions.clickButton(driver, PageElements.amzUKFilterAnyCategory);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        sb.append(CommonFunctions.clickButton(driver, PageElements.amzUKFilterSeeMore));
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
    System.out.println("filterTest Failures:\n" + sb.toString());
}

BrowserLauncher.java

BrowserLauncher.java

public WebDriver launchBrowser(String BrowserName) {
    if(BrowserName.equalsIgnoreCase("Firefox")) {
        driver = new FirefoxDriver();
        driver.manage().window().maximize();
    } else if(BrowserName.equalsIgnoreCase("IE")) {
        DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
        capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
        capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
        capabilities.setCapability(InternetExplorerDriver.INITIAL_BROWSER_URL, "");
        System.setProperty("webdriver.ie.driver", "C:\\Eclipse EE x86 Workspace\\ResidentAdvisorLabels\\IEDriverServer.exe");
        driver = new InternetExplorerDriver(capabilities);
        driver.get("javascript:document.getElementById('overridelink').click();");
    } else if(BrowserName.equalsIgnoreCase("Chrome")) {
        ChromeOptions op = new ChromeOptions();
        op.addArguments("--user-data-dir=C:\\Users\\Bernard\\Desktop\\Selenium Data");
        op.addArguments("--start-maximized");
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
        System.setProperty("webdriver.chrome.driver", "C:\\Eclipse EE x86 Workspace\\ResidentAdvisorLabels\\chromedriver.exe");
        driver = new ChromeDriver(op);
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    } else if(BrowserName.equalsIgnoreCase("PhantomJS")) {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("takesScreenshot", false);
        String d = "\\";
        capabilities.setCapability("phantomjs.binary.path", "C:"+d+"Eclipse EE x86 Workspace"+d+"phantomjs-2.0.0-windows"+d+"bin"+d+"phantomjs.exe");
        capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
        capabilities.setCapability("load-images", false);
        driver = new PhantomJSDriver(capabilities);
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    }

    return driver;
}

testng.xml

<suite name="Suite1" verbose="1">
<parameter name="searchTerm" value="Selenium Webdriver" />
<parameter name="URL" value="Http://www.amazon.co.uk" />
<parameter name="email" value="scrubbed" />
<parameter name="password" value="scrubbed" />
<test name="AmazonUKTesting">
    <classes>
        <class name="tests.amazonUKTests.BrowserFunctions" />
        <class name="tests.amazonUKTests.Login" />
        <class name="tests.amazonUKTests.Search" />
        <class name="tests.amazonUKTests.Filter" />
    </classes>
</test>

我的问题是,我似乎无法将返回到 BrowserFunctions.java 类的 WebDriver 传递给我的测试套件中的其他类,而不必在每个 java 文件中创建 WebDriver 的新实例.我想打开浏览器,打开 URL,然后在同一个浏览器窗口中一个接一个地运行 3 个测试,并在完成后关闭浏览器.

My problem is that i cannot seem to be able to pass the WebDriver that is returned to the BrowserFunctions.java class on to the other classes in my test suite without having to create a new instance of WebDriver in each java file. I am looking to open the browser, open the URL, then run the 3 tests one after another in the same browser window, and have the browser close when done.

推荐答案

您可以按照其他人的建议扩展基类,也可以使用 TestNG Guice 依赖注入.例如:

You can extend a base class as others have suggested or you can use TestNG Guice dependency injection. e.g.:

TestModule.class

TestModule.class

import com.google.inject.Binder;
import com.google.inject.Module;

public class TestModule implements Module {
    @Override
    public void configure(Binder binder) {
        BrowserLauncher bl = new BrowserLauncher();
        WebDriver driver = bl.launchBrowser("Firefox");
        binder.bind(WebDriver.class).toInstance(driver);
    }
}

BrowserFunctions.java

BrowserFunctions.java

import com.google.inject.Inject;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Guice;
import org.testng.annotations.Parameters;

@Guice(modules = {TestModule.class})
public class BrowserFunctions {
    @Inject
    WebDriver driver;

    @Parameters({ "URL" })
    @BeforeSuite
    public void invokeURL(String URL) {
        driver.get(URL);
    }

    @AfterSuite
    public void closeBrowser() {
        driver.close();
    }
}

登录.java

import com.google.inject.Inject;
import org.testng.Assert;
import org.testng.annotations.Guice;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import java.util.concurrent.TimeUnit;

@Guice(modules = {TestModule.class})
public class Login {
    @Inject
    WebDriver driver;
    StringBuilder sb = new StringBuilder();

    @Parameters({ "email", "password" })
    @Test
    public void logInTest(String email, String passowrd) {
        Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKsignInCTA), "Sign in CTA visible");
        CommonFunctions.clickButton(driver, PageElements.amzUKsignInCTA);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKEmailField), "Email field visible");
        CommonFunctions.inputToField(driver, PageElements.amzUKEmailField, email);
        Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKPasswordField),
                "Password field visible");
        CommonFunctions.inputToField(driver, PageElements.amzUKPasswordField, passowrd);
        Assert.assertTrue(CommonFunctions.checkVisibility(driver, PageElements.amzUKSignInButton),
                "Sign in button visible");
        CommonFunctions.clickButton(driver, PageElements.amzUKSignInButton);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        Assert.assertEquals(driver.getCurrentUrl(), "https://www.amazon.co.uk/?ref_=nav_ya_signin&");
    }
}

这篇关于如何在 TestNg 类之间传递 WebDriver 的单个实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-10 21:58