本文介紹了有沒有一種方法可以調用擴展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支持的數據類型,因此創建自定義類型比使用此用例更麻煩。您將使用WebDriverManager
getIntance()
,并使用瀏覽器名稱而不是驅動程序類。
這篇關于有沒有一種方法可以調用擴展Web驅動程序類的Java方法?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,