如何在Selenium中创建一个将从另一个类调用的driver.get函数?

时间:2018-01-05 05:45:24

标签: java eclipse maven selenium junit

好的,我正在使用POMSelenium/Maven中创建一种框架。该项目有三个包

  1. 页面(包括我将浏览的不同网页)
  2. 测试(将调用函数并执行)和
  3. Util (包含一个Library类,其中包含我想从Test and Pages包中的类调用的函数)
  4. 这是我在Library类中的代码:

    package util;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    
    public class Lib {
    
    //Question is regarding the method below
    public static WebElement get(WebDriver driver, String url) {
        WebElement link = driver.get(url);
        return link;
    }
    
    public static WebElement findelement(WebDriver driver, String xpath) {
        WebElement e = driver.findElement(By.xpath(xpath));
        return e;
    }
    
    public static void sleep(WebDriver driver, int sec) throws InterruptedException {
        Thread.sleep(sec*1000); 
    }
    }
    

    我希望能够从测试类中的Lib类调用get方法(第一个)。这是我的测试类代码:

    package test;
    
    import org.junit.Before;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    import util.Lib;
    
    public class Test extends Lib{
    
    static WebDriver driver = new ChromeDriver();
    
    @Before
    public void before() {
        System.out.println("Before Class starts here");
    
        System.setProperty("webdriver.chrome.driver",
                "C:\\Users\\TQ\\sel\\chromedriver_win32\\chromedriver.exe");
    
        driver = new ChromeDriver();
    
        Lib l = new Lib();
        l.get(driver, "https://www.google.com/");
    
    
    }
    }
    

    我知道我可以轻松地在测试类中执行driver.get(url)但我想知道为什么它不能像我的lib类中的其他函数那样工作。

    这是我收到"cannot convert from void to WebElement"的错误消息。

    提前致谢。

3 个答案:

答案 0 :(得分:1)

您必须将webdriver的引用对象从测试类传递给lib。从测试类中删除extends Lib。在lib类中创建一个构造函数,用于初始化引用对象。 Library类看起来应该是这样的。

package util;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class Lib {
WebDriver driver;
public Lib(WebDriver driver){
     this.driver = driver;
}
//Question is regarding the method below
public static WebElement get(String url) {
    WebElement link = driver.get(url);
    return link;
}

public static WebElement findelement(String xpath) {
    WebElement e = driver.findElement(By.xpath(xpath));
    return e;
}

public static void sleep(int sec) throws InterruptedException {
    Thread.sleep(sec*1000); 
}
}

现在,使用 new 运算符创建Lib对象时,必须传递驱动程序实例。构造函数会将驱动程序引用传递给本地驱动程序变量,这将允许Test类使用Lib类方法。

Lib l = new Lib(driver);
l.get("https://www.google.com/");

将驱动程序实例传递给方法参数的编码方式将导致空指针异常。

答案 1 :(得分:1)

此方法无效。它应该看起来像:

//Question is regarding the method below
public static void get(WebDriver driver, String url) {
      driver.get(url);
}

这就是全部。在这种情况下你不需要返回一些东西。

答案 2 :(得分:1)

错误说明了一切:

"cannot convert from void to WebElement"

您已编写方法 public static WebElement get(WebDriver driver, String url) {} 。但 get()不返回任何内容,定义为:

get(java.lang.String url)
Load a new web page in the current browser window.

Return Type :
  void

因此,当您调用 WebElement link = driver.get(url); 时,return type与函数调用不匹配,并且会引发错误。

解决方案

解决方案是将返回视为 void 。在driver打开URL后,您可以通过Web Browser实例轻松与WebDriver实例进行互动,例如driver,如下所示:

public static void get(WebDriver driver, String url) {
    driver.get(url);
}