2

Serenity + cucumber + Java + maven ( > mvn archetype:generate -Dfilter net.serenity-bdd:serenity-cucumber) を使用してサンプル プロジェクトを作成しました。

Firefox ブラウザーが起動して、次の Web サイトに移動するタイミングを確認できます。

@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 変数を使用します。この「Web ドライバー」変数を取得するために宣言する必要がある構文は何ですか? ありがとう ノウナダ =========================

Jデロリアン!

どうもありがとうございました。ここにコードがあります..「ドライバー」の何が問題なのかを指摘するのを手伝ってくれませんか?

1 - 機能ファイル: 機能: Amazon ユーザーのログイン認証 シナリオ: Amazon ユーザーのログイン認証 特定のユーザーが「ホーム」ページにいる場合

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();
    } 
}
4

3 に答える 3

1

PageObjectにはgetDriver()メソッドがあり、 を使用する必要がある場合に使用する必要がありますWebDriver

フレームワークを使用する場合は、 Serenity BDD のマニュアルを読むことを強くお勧めします。ほとんどの質問に対する答えがそこにあるはずです。または、 Serenity BDD Users Groupを確認してください。

于 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();は、"driver" ローカル変数でヌル ポインターになります。私の推測では、getDriver()スナップショットとシナリオのステップに関するレポートを作成する必要があるため、フレームワークはそれを保護する必要があると思います。だからあなたはそれを持っています。フレームワークを使用するだけgetDriver()で、ページ クラスを基本/抽象クラス PageObject の拡張として宣言する限り、問題なくページからページへと移動できます。ページ クラスの例:

public void HomePage extends PageObject {
}

HomePage クラスをインスタンス化するとHomePage homePage;、フレームワークのドライバーが自動的にhomePage. 要素をクリックしたいとしましょう。単純に次のように述べます。

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