【问题标题】:Serenity... how to get the Webdriver?Serenity...如何获取 Webdriver?
【发布时间】:2016-10-16 23:20:17
【问题描述】:

我刚刚使用 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 变量。我需要声明什么语法才能访问这个“网络驱动程序”变量? 谢谢 知无 ==========================

JDelorean!

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

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

2 - 步骤定义文件: 包 com.XXXX.steps; 导入 net.thucydides.core.annotations.Steps; 导入 com.XXXX.steps.serenity.User; 导入 cucumber.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 - 测试运行器类 包 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();
    } 
}

【问题讨论】:

  • 这个和驱动管理有关。检查备用讨论here

标签: java maven cucumber serenity-bdd


【解决方案1】:

PageObject 有一个getDriver() 方法,如果你需要使用WebDriver,你应该使用它。

如果您打算使用该框架,我强烈建议您研究Serenity BDD's Manual。您应该在那里找到大多数问题的答案。或者,检查Serenity BDD Users Group

【讨论】:

  • 感谢 JDeloran 指导我的小组。我确实从 PageObject 超类中找到了getDriver(),然后我尝试在它扩展 PageObject 超类的类中捕获该超级驱动程序WebDriver driver = getDriver()。我没有看到任何抱怨。然后当我试图通过System.out.println ("driver value +" + driver)查看驱动程序的内容时,我得到了一个空指针异常..嗯
  • 首先确保你已经初始化了WebDriverPageObject 对此不承担任何责任,也不会为您这样做。请编辑您的问题并发布您初始化driver 的代码。
【解决方案2】:

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

public void HomePage extends PageObject {
}

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

   getDriver().findElement(By.xpath("locationOfTheTargetElement").click();

【讨论】:

    【解决方案3】:

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

    WebDriver driver = Serenity.getDriver();
    driver.findElement(By.xpath....);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2014-03-21
      相关资源
      最近更新 更多