有没有一种方法可以调用扩展Web驱动程序类的Java方法? [英] Is there a way to call a java method that extends a webdriver class?

查看:52
本文介绍了有没有一种方法可以调用扩展Web驱动程序类的Java方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用WebDriverManager Java库。它提供了一个通用管理器,可以被参数化为特定的管理器(对于Chrome、Firefox等)。我将它与Selify WebDriver和JUnit5的@PARAMETIZED和@ValueSource注释一起使用,这样我就可以在多个浏览器上运行我的测试。 我按照WebDriverManager文档创建了一个实现:

 public class WebTest {

 WebDriver driver = null;


 @ParameterizedTest
 @ValueSource(classes = { ChromeDriver.class, FirefoxDriver.class })
 public void navigateToUrl(String url, Class<? extends WebDriver> webDriverClass) { //WebDriver class gets extended
 driver = WebDriverManager.getInstance(webDriverClass).create();
 driver.manage().window().maximize();
 driver.get(url);

在包含黄瓜步骤定义的类中,我尝试调用navigateToUrl方法,但出现如下编译错误:

  public class WebAppStepDefinitions {
  private final WebTest webTest = new WebTest();


  @Given("^I have navigated to the web url "([^"]*)"$")
  public void navigateToUrl(String url) {
  webTest.navigateToUrl(url, Class<? extends WebDriver > webDriverClass); //error on this line: `Cannot resolve symbol webDriverClass`
  }

如何正确调用位于WebTest类中的navigateToUrl

推荐答案

根据@ValueSource documentation,您不能使用此注释来传递某些类的实例。该批注只能用于传递原始值、字符串和(不能传递对象)。您可以使用这些类来测试某个方法或某个对象是否为参数类的实例。不能使用它将实例传递给方法。

而不是,您可以做的是使用@MethodSource API传递方法的名称,该方法可以为您提供(返回)那些实例(查找谈论多个参数的段落)。例如,我认为您可以这样做:

@ParameterizedTest
@MethodSource("getWebDrivers")
public void navigateToUrl(String url, List<WebDriver> drivers) {
 driver = WebDriverManager.getInstance(webDriverClass).create();
 driver.manage().window().maximize();
 driver.get(url);
}


public Stream<Arguments> getWebDriversAndUrl() {
    List<WebDrivers> drivers = new ArrayList<>();
    ... // Here you need to instantiate your drivers (skip if you have them already instantiated and set as global variables.
    drivers.add(chromeDriver);
    drivers.add(firefoxDriver);
    return return Stream.of(
        arguments("url1", drivers),
        arguments("url2", drivers);
}

更新

您的实现有一个编译错误,因为您未能在步骤定义中声明Web驱动程序类的参数。步骤定义只有一个参数。此行

webTest.navigateToUrl(String url, Class<? extends WebDriver > webDriverClass);

需要

webTest.navigateToUrl(url, webDriverClass);

问题是您在步骤定义中有一个作为参数传递的URL,而不是Class对象。

如果从步骤定义内部调用该方法,则甚至不需要使用@ValueSource。您只需要一个数据表,并以这种方式直接从步骤定义传递参数:

@Given("^I have navigated to the web url$")
public void navigateToUrl(DataTable table) {
    List<list> data = table.raw();
    // iterate thru list and call driver.get(url);

}

您的测试步骤应该如下所示:

Given I have navigated to the web url
| url | chrome |
| url | firefox |

由于您不能直接传递Class实例,因为它不是Cucumber支持的数据类型,因此创建自定义类型比使用此用例更麻烦。您将使用WebDriverManagergetIntance(),并使用浏览器名称而不是驱动程序类。

这篇关于有没有一种方法可以调用扩展Web驱动程序类的Java方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆