如何将 selenium webdriver 实例传递给另一个类

问题描述 投票:0回答:5

我浏览了该网站,但没有找到我正在寻找的答案。

我有

  1. 超级基类 - 这里我只是创建一个网络驱动程序的对象
  2. Baseclass- 在这个类中,我扩展 Superbase 类,调用驱动程序,并打开 URL。
  3. Clicklink 类 - 在这个类中,我再次扩展了 Superbase 类,但只发现了空指针异常。我认为我收到异常是因为驱动程序对象未初始化。

我只是一个初学者,还没有尝试过 browserfactory 和其他选项,因为我想从简单的流程开始。

超类

Public class Superclass
{
public webdriver Driver;
}

基类

public class Baseclass extends Superclass
{
setting capabilities and launching the browser
}

点击链接

public class Clicklink extends Superclass
{
here I want to click on a link
driver.findelement(by.xpath("xpath").click());
// after this statement I get a null pointer exception
}

您能在这里指导我吗?我怎样才能达到同样的效果。

非常感谢!

java selenium-webdriver
5个回答
4
投票

SuperClass
BaseClass
是非常糟糕的名字。不要使用编码语言来命名您的类,使用问题的语言。在这种情况下,网站应用程序测试,使用 LoginPage、CartPage、ProfilePage 等。使用 Page Object Pattern

我建议您使用工厂模式为每个测试提供WebDriver实例。由于所有这些都符合“是页面”的想法,因此使用标准 PageObject 的类扩展来提供此功能。导航时,让当前页面构造新页面的实例并向其传递当前 webDriver 连接实例。然后,您应用于该 PageObject 的任何操作都将自动应用于该 webDriver 实例及其关联的浏览器实例。您还应该使用

PageFactory
来提供 pageObject 的实例。
public abstract class PageObject {
    public WebDriver driver;
    PageObject() {
        // Page can initialise its self
        this.driver = BrowserFactory.webDriver();
    }
    PageObject(final WebDriver webDriver) {
        this.driver = webDriver;
        }
    }



3
投票

public class Superclass { public WebDriver driver; public Superclass(){ driver = new FirefoxDriver(); } public WebDriver getdriver(){ if (driver == null){ driver = new FirefoxDriver(); return driver; }else{ return driver; } } }

稍后在方法中您可以通过以下方式调用它:

public class Clicklink extends Superclass { getdriver().findelement(by.xpath("xpath").click()); }



0
投票

class Driver { public static ThreadLocal<IWebDriver> driverInstance = new ThreadLocal<IWebDriver>(); public static IWebDriver GetDriver() { return driverInstance.Value; } public static void SetDriver(IWebDriver driver) { driverInstance.Value = driver; } }

并将此容器字段设为
ThreadLocal

以避免并行运行出现问题。


0
投票
setup()

时,我使用“浏览器”系统属性来获取浏览器名称。就我而言,我使用 JUnit 注释,以便 JUnit 在运行任何测试之前设置所有需要的依赖项。


@BeforeClass public static void setup() throws Exception { // Set up other stuff String browser = System.getProperty("browser"); try { SessionDataProvider.driver = TestUtils.createDriver(browser); } catch (Exception e) { ... } }

createDriver(String)

是实例化正确驱动程序的工厂方法。


public static WebDriver createDriver(String browserName) throws Exception { WebDriver driver = null; try { switch(browserName) { case "firefox": // code to system props and instantiate the driver break; case "chrome": // code to system props and instantiate the driver break; case "ibrowser": // code to system props and instantiate the driver break; case "edge": // code to system props and instantiate the driver break; case "safari": // code to system props and instantiate the driver break; default: throw new Exception("Unsupported browser: " + browserName); } return driver; }

然后,当我执行步骤定义时,我只需从数据提供者类中获取驱动程序即可:

@And("(I click)/Click on {string}") public void click(String arg) { // Parse String arg and create web element locator... try { By locator = ...; WebElement element = new WebDriverWait(SessionDataProvider.driver, 2) .until(ExpectedConditions.elementToBeClickable(locator)); element.click(); } catch (Exception e) { // handle exception } }



-1
投票
© www.soinside.com 2019 - 2024. All rights reserved.