0

Selenium Webdriver + TestNG フレームワークに PageObject パターンを使用しています。
私のpageObjectクラスには、driver.findElementを使用して同じページに存在する同じWeb要素を見つける複数のメソッドがあります。
例えば:

 public class HomePage extends BasePage {
        private WebElement searchField;
        private String searchFieldLocator;


        HomePage(WebDriver driverFromTest, CustomLogger loggerFromTest,
                HashMap<String, String> testDataMapFromTest)
        {
            super(driverFromTest, loggerFromTest, testDataMapFromTest);
            searchFieldLocator = testDataMap.get("searchFieldLocator");

        }


        public void method1()
      {

        searchField = driver.findElement(By.cssSelector(searchFieldLocator));
        searchField.sendKeys("foo");

      }


      public void method2()
      {
         searchField = driver.findElement(By.cssSelector(searchFieldLocator));
         searchField.sendKeys("bar");
      }



私の質問は次のとおり
です。1.同じ WebElement 変数で driver.findElement を複数回使用しないようにするにはどうすればよいですか。WebElement を見つけたら、driver.findElement を使用せずに他のメソッドで変数を使用する方法が必要です。@CacheLookup アノテーションで @FindBy(how = How.NAME, using = "locatorstring") を使用できる PageFactory について読みました。それは私が必要とするものですか?CacheLookup は driver.findElement を 1 回だけ使用し、参照を再利用しますか?

2. 次に、同じ Web 要素に対して driver.findElements を何度も実行すると、メモリが大量に消費されますか? これは心配する必要のないマイクロ最適化ですか?

次のようなメソッドを記述して、同じ Web 要素で driver.findElement を実行しないようにする方法を考えました。

 protected WebElement getWebElement(By by, String elementName) {
        WebElement element;

        if(webElementMap.get(elementName)==null)
        {
           element = driver.findElement(by);
           webElementMap.put(elementName, element);
        }
        else
            element = webElementMap.get(elementName);

        return element;

    }

これは正しい方法ですか?

4

2 に答える 2

1

Saucelabs などのグリッド プロバイダーを使用する場合、複数の呼び出しが問題になる可能性があります。

各 Webdriver コマンドは API 呼び出しになるため、次の例では 2 つの API 呼び出しが行われます。

searchField = driver.findElement(By.cssSelector(searchFieldLocator));
searchField.sendKeys("foo");

グリッドへのリクエストは、ChromeDriver などの特定のドライバーを使用する場合よりも大幅に遅くなるため、グリッドを使用する可能性のあるテストを作成する際には、これを考慮する必要があります。オブジェクトのキャッシュはこれを実現する方法です。

ただし、オブジェクトをキャッシュすると、StaleObject問題が発生する可能性が高いため、Kenny Rogers を引用します。

「いつそれらを保持するか、いつ折りたたむかを知る必要があります」

キャッシング戦略を制御したいので、私は個人的に@FindByと注釈から離れています@CacheLookup

于 2013-08-22T12:21:47.093 に答える