1

2 つのブラウザー (Chrome、Firefox) でセレン キュウリの Java スクリプトを実行しようとすると、スタックします。単一のブラウザーを使用すると、テストは正常に機能します。Selenium PageFactory クラスを使用して Web 要素を初期化します。

問題は、2 つのブラウザーでテストを実行すると、最初のブラウザーが開き、URL に移動しても何も起こらないことです。Web 要素は初期化されていません。テストは 2 番目のブラウザーに進み、URL に移動し、Web 要素が初期化され、後続のテスト メソッド ( testMethod1) が期待どおりに実行されます。最初のブラウザーでテストが実行されないのはなぜですか?

これは、Web 要素を保持する PageFactory BasePage クラスです。

public class BasePage {       
private final WebDriver driver;  

public BasePage(WebDriver driver) {this.driver = driver;} //constructor


 @FindBy(id = "cc-amount")
 public WebElement amountField;

これはテスト クラスであり、2 つのブラウザーでテストを実行しようとした方法です。

public class Convert {

  private static WebDriver driver;
  private final BaseUtil baseUtil = new BaseUtil();
  private static BasePage basePage;
  private static int browser;



 public void navigateToUrl(String url) throws InterruptedException {  
for (browser = 1; browser <= 2; browser++) {

  if (browser == 1) {
    WebDriverManager.chromedriver().setup();
    driver = new ChromeDriver();

  } else if (browser == 2) {
    WebDriverManager.firefoxdriver().setup();
    driver = new FirefoxDriver();
  }

  driver.get(baseUtil.getMyUrl()); //Url coming from a utility class
  driver.manage().window().maximize();
  driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  basePage = PageFactory.initElements(driver, BasePage.class); //initialisation of the BasePage class conttaining the pagefactory web elements

ブラウザーの初期化後、このメソッドは 2 番目のブラウザー (Firefox) では正常に実行されますが、最初のブラウザー (Chrome) ではまったく実行されませんでした。

  public void testMetod1(String amount) throws InterruptedException {
  basePage.amountField.click();

私の疑いでは、1 回の実行で両方のブラウザーに対して PageFacory を開始できなかったのですが、これをさらに診断する方法がわかりません。forループ エラーの可能性もあります。

4

3 に答える 3

1

同期の問題だと思います。ブラウザごとにクラスを作成するだけで、すべての共有コードを含む別の基本クラスを作成できます。

ブラウザごとにクラスを作成すると、いくつかの利点が得られます。

  1. よりクリーンなコード。
  2. テストは並行して実行されます。
  3. 特定のブラウザ向けの特定のテスト ケース (特に IE 向け)。
  4. この同期の問題を解決します。

したがって、基本的に Converter を使用する代わりに、次のものを作成できます。

  • Chrome コンバーター
  • FirefoxConverter

そして、TestExecuter クラス内で、それぞれのインスタンスを作成し、テストを実行するだけです。

さらに詳しく説明すると、1 つのクラスを使用してConvertいて、その中に 2 つの静的変数があります。

  private static WebDriver driver;
  private static BasePage basePage;

BasePage クラスから static キーワードを削除しても根本的な原因は解決されません。静的クラスであり、インスタンス クラスとしてインスタンス化できない BasePage を使用していて、外部ライブラリ内にあるため、クラスを一種のラッパーとして分離する必要があるためです。 .

ここでは、最初のテストを待って破棄し、2 番目のテストに関連するすべてのものを再び初期化するまで、Chrome と Firefox で同じ正確な初期化を使用しようとしています。

したがって、正しいアプローチは、次のようにブラウザごとに個別の Convert を作成することです。

ChromeConverter
FirefoxConverter

そして、TestExecuter では、それぞれを初期化して使用する必要があります。次のようになります。

 @Given("...")
 public void navigateToUrl(String url) throws InterruptedException {
   chromeConverterApp.navigateToUrl(url);
   firefoxConverterApp.navigateToUrl(url);
 }
 @When("^..")
 public void enterCurrencies(String amount, String from, String to) throws InterruptedException {
   chromeConverterApp.enterCurrencies(amount, from, to);
   firefoxConverterApp.enterCurrencies(amount,from,to);
 }
于 2019-08-02T15:46:15.453 に答える