簡體   English   中英

如何避免在同一個web元素上調用多個driver.findElement?

[英]How to avoid multiple driver.findElement calls on the same web element?

我在我的selenium webdriver + TestNG框架中使用PageObject模式。
在我的pageObject類中,我有多個方法,我使用driver.findElement來查找同一頁面上存在的相同webelement。
例如:

 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。 我已經閱讀了有關PageFactory的內容,您可以將@FindBy(how = How.NAME,using =“locatorstring”)與@CacheLookup注釋一起使用。 這是我需要的嗎? CacheLookup只使用一次driver.findElement並重新使用引用嗎?

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;

    }

這是正確的方法嗎?

@CacheLookup只使用一次driver.findElement並重新使用該引用。

注意,雖然你可能會開始穿越StaleElementReferenceException

使用網格提供程序(如Saucelabs)時,多次調用可能會出現問題。

每個Webdriver命令都會產生一個API調用,因此以下內容會產生兩個API調用;

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

對網格的請求將比使用特定驅動程序(如ChromeDriver)慢一些,因此在編寫可能使用Grid的測試時必須考慮這一點。 緩存對象是實現此目的的方法。

但是,如果你緩存對象,你可能會遇到StaleObject問題,所以你要引用Kenny Rogers;

“你必須知道何時抓住他們,知道何時棄他們”

我個人遠離@FindBy@CacheLookup注釋因為我想要控制緩存策略

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM