繁体   English   中英

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

[英]How to pass selenium webdriver instance to another class

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

我有

  1. 超级基类 - 在这里我只是创建一个 webdriver 的对象
  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
}

你能在这里指导我吗? 我怎样才能达到同样的目标。

非常感谢!

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

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

public abstract class PageObject {
    public WebDriver driver;
    PageObject() {
        // Page can initialise its self
        this.driver = BrowserFactory.webDriver();
    }
    PageObject(final WebDriver webDriver) {
        this.driver = webDriver;
        }
    }

这是我的很多猜测,但请确保您的超类实际上设置了驱动程序并返回它。 您实际上可以通过两种方法实现:

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());

}

如果您不想将驱动程序实例传递给页面对象构造函数,您可以为驱动程序创建一些容器类并将其放在测试之前并在运行后将其删除。 例如:

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以避免并行运行出现问题。

我采取了与此线程上的大多数方法略有不同的方法。 当我开始测试会话时,我将浏览器名称作为参数传递(即 -Dbrowser=chrome),以便能够使用不同的浏览器测试我的 Web 应用程序。 然后,当我的测试框架调用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
    }
}
I did use below code in utility class like below
  public static WebDriver setup(WebDriver driver)
   {
       if(driver == null) {
           driver = new FirefoxDriver();
           driver.manage().window().maximize();
           driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
           return driver;
       }else
          return driver;

         //System.out.println("in method "+ driver.getTitle() );

   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM