【问题标题】:How do I create a driver.get function in Selenium that will be called from another class?如何在 Selenium 中创建一个 driver.get 函数,该函数将从另一个类中调用?
【发布时间】:2018-06-14 22:14:18
【问题描述】:

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

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

这是我在 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"

提前致谢。

【问题讨论】:

  • 我也是一个完整的新手,所以任何帮助表示赞赏。还有谁能告诉我为什么我对这篇文章投了反对票?

标签: java eclipse maven selenium junit


【解决方案1】:

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

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

仅此而已。在这种情况下,您无需退货。

【讨论】:

  • 感谢您的简单回答
【解决方案2】:

您必须将 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/");

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

【讨论】:

    【解决方案3】:

    错误说明了一切:

    "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 时,您可以通过WebDriver 实例轻松与Web Browser 实例交互,即driver,如下所示:

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

    【讨论】:

    • 感谢您的回复。有用。但是,您能解释一下findelement(WebDriver driver, String xpath) 方法需要返回一个值,而get(WebDriver driver, String url) 方法不需要吗?
    猜你喜欢
    • 2021-04-23
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多