2

我刚刚使用 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 ==========================

杰德洛里安!

非常感谢你的帮助。这是代码..请您帮助tp指出“驱动程序”有什么问题吗?

1 - 功能文件:功能:亚马逊用户登录身份验证场景:亚马逊用户登录身份验证给定用户在“主页”页面上

2 - 步骤定义文件:package 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();
    } 
}
4

3 回答 3

1

PageObject有一个getDriver()方法,如果您需要使用WebDriver.

如果您打算使用该框架,我强烈建议您学习Serenity BDD 手册。您应该在那里找到大多数问题的答案。或者,检查Serenity BDD 用户组

于 2016-10-17T07:32:58.033 回答
0

这可以通过以下方式实现。

WebDriver driver = Serenity.getDriver();
driver.findElement(By.xpath....);
于 2021-07-07T09:46:02.377 回答
0

由于某些未知原因,Serenity-BDD:Cucumber 框架不允许您将其驱动程序分配给本地变量。此赋值语句WebDriver driver = getDriver();将导致“驱动程序”局部变量中的空指针。我的猜测是框架需要保护它getDriver(),因为它需要报告快照和场景步骤。所以你有它。只需使用框架getDriver(),只要将页面类声明为基/抽象类 PageObject 的扩展,您就可以毫无问题地从一个页面驱动到另一个页面。您的页面类的示例:

public void HomePage extends PageObject {
}

在您实例化 HomePage 类HomePage homePage;时,框架的驱动程序会自动附加到homePage. 假设您想单击一个元素,您只需声明:

   getDriver().findElement(By.xpath("locationOfTheTargetElement").click();
于 2016-10-28T00:28:05.553 回答