[英]Serenity… how to get the Webdriver?
我剛剛使用 Serenity + Cucumber + java + maven ( > mvn archetype:generate -Dfilter net.serenity-bdd:serenity-cucumber) 創建了一個示例項目。
我可以看到它什么時候打開一個 Firefox 瀏覽器並轉到這個網站:
@DefaultUrl("http://en.wiktionary.org/wiki/Wiktionary")
問題:從這一點開始,創建了一個“WebDriver 驅動程序”,但如何獲取/獲取該“驅動程序”變量? 我正在嘗試使用 driver.getWindowHandle() 獲取窗口 ID。
更新:聲明如下:
@DefaultUrl("http://en.wiktionary.org/wiki/Wiktionary")
public class DictionaryPage extends PageObject {...}
我查找了 PageObject 超類,發現了這個:
public abstract class PageObject extends net.serenitybdd.core.pages.PageObject {
protected PageObject() {
super();
}
protected PageObject(WebDriver driver, Predicate<? super net.serenitybdd.core.pages.PageObject> callback) {
super(driver, callback);
}
public PageObject(WebDriver driver, int ajaxTimeout) {
super(driver, ajaxTimeout);
}
public PageObject(WebDriver driver) {
super(driver);
}
}
所以.. PageObject 使用來自另一個超類的 webdriver 變量。 我需要聲明什么語法才能獲得這個“網絡驅動程序”變量? 謝謝知道nada ==========================
JDelorean!
非常感謝您的幫助。 這是代碼..你能幫我指出“驅動程序”有什么問題嗎?
1 - 功能文件:功能:亞馬遜用戶登錄身份驗證場景:亞馬遜用戶登錄身份驗證給定用戶在“主頁”頁面上
2 - 步驟定義文件:包 com.XXXX.steps; 導入 net.thucydides.core.annotations.Steps; 導入 com.XXXX.steps.serenity.User; 進口黃瓜.api.java.en.Given;
class DefinitionSteps {
@Steps
User user;
@Given("^user is on the \"([^\"]*)\" page$")
public void user_is_on_the_Amazon_page(String pageName)throws Throwable{
user.is_on_the_page(pageName);
}
}
3 - Test Runner 類包 com.XXXX;
import cucumber.api.CucumberOptions;
import net.serenitybdd.cucumber.CucumberWithSerenity;
import org.junit.runner.RunWith;
@RunWith(CucumberWithSerenity.class)
@CucumberOptions(features="src/test/resources/features")
public class DefinitionTestSuite {
}
4 - 我無法捕獲驅動程序的用戶類。 請注意,在此文件的末尾,注釋掉的行是不起作用的行。 另請注意,“驅動程序”被設置為原始驅動程序“home.getDriver()”,但該值以某種方式傳遞給“驅動程序”,但驅動程序“home.getDriver()”工作正常。
package com.XXXX.steps.serenity;
import com.XXXX.pages.Home;
import net.thucydides.core.annotations.Step;
import net.thucydides.core.steps.ScenarioSteps;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class User extends ScenarioSteps{
Home home = new Home();
WebDriver driver = home.getDriver();
@Step
public void is_on_the_page(String pageName) throws Throwable {
home.open();
home.getDriver().findElement(By.xpath(home.homeElements.get("Hello. Sign in"))).click();
// driver.findElement(By.xpath(".//*[@id='nav-link-yourAccount']/span[1]")).click();
}
}
PageObject
有一個getDriver()
方法,如果您需要使用WebDriver
,您應該使用它。
如果您打算使用該框架,我強烈建議您閱讀Serenity BDD 的手冊。 您應該在那里找到大多數問題的答案。 或者,檢查Serenity BDD 用戶組。
由於某些未知原因,Serenity-BDD:Cucumber 框架不允許您將其驅動程序分配給您的局部變量。 這個賦值語句WebDriver driver = getDriver();
將導致“驅動程序”局部變量中的空指針。 我的猜測是該框架需要保護它的getDriver()
因為它需要報告快照和場景步驟。 所以你有它。 只需使用框架的getDriver()
,只要您將頁面類聲明為基類/抽象類 PageObject 的擴展,您就可以毫無問題地從一個頁面驅動到另一個頁面。 您的頁面類的示例:
public void HomePage extends PageObject {
}
在你實例化 HomePage 類HomePage homePage;
框架的驅動程序會自動附加到homePage
。 假設你想點擊一個元素,你只需聲明:
getDriver().findElement(By.xpath("locationOfTheTargetElement").click();
這可以通過以下方式實現。
WebDriver driver = Serenity.getDriver();
driver.findElement(By.xpath....);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.