![](/img/trans.png)
[英]How element.findElement() method in selenium works [not 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.