当前位置: 首页 > 知识库问答 >
问题:

如何避免在同一个web元素上的多个driver.find元素调用?

乐华晖
2023-03-14

我正在为SeleniumWebDriver测试框架使用PageObject模式
在我的pageObject类中,我有多个使用驱动程序的方法。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。我想要一种方法,一旦我找到网络,我将在任何其他方法中使用变量,而不使用driver.find元素。我读过关于PageFactory的文章,在那里你可以使用@FindBy(how=how。NAME,使用="locatorstring")和@CacheLookup注释。这是我需要的吗?CacheLookup是否只使用driver.find元素一次并重新使用引用?

2.其次,当您对同一个web元素执行太多次driver.find元素时,它是否会变得内存密集型?这个微优化是我不需要担心的吗?

我想到了一种方法,通过编写这样的方法来避免在同一个web元素上执行driver.find元素:

 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;

    }

这样做对吗?

共有2个答案

燕凯旋
2023-03-14

在使用网格提供程序(如Saucelabs)时,多个调用可能是一个问题。

每个Webdriver命令都会导致一个API调用,因此下面的命令将进行两个API调用;

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

对网格的请求会比用户慢一些,例如ChrimEdvor的特定驱动程序,所以在编写可能使用网格的测试时,您必须考虑这一点。缓存对象是实现这一点的方法。

但是,如果缓存对象,很可能会遇到StaleObject问题,因此请引用Kenny Rogers的话;

“你要知道什么时候拿,什么时候折叠”

我个人远离@FindBy@CacheLookup注释,因为我想控制缓存策略

诸福
2023-03-14

是呀

@CacheLookup确实使用驱动程序。findElement仅一次并重新使用引用。

请注意,尽管您可能会开始通过StaleElementRe的异常

 类似资料:
  • 问题内容: 我已经看过其他几个问题,但似乎无法弄清楚它们中的任何一个,所以这是我的问题,我想要一个div或span,当您将鼠标悬停在它上面时,就会出现一个区域,就像是一滴水下。 例如我有一个div,我想将鼠标悬停在上面,并让它显示有关我悬停的项目的一些信息 但这似乎不起作用,我不知道为什么…,如果有办法在CSS中做到这一点,我想知道,但是我想要任何和所有建议。 问题答案: 仅当隐藏的div是用于悬

  • 问题内容: 这是一个非常简单的问题,但是我找不到关于CSS过渡属性的很好的文档。这是CSS代码段: 如您所见,过渡属性相互覆盖。就目前而言,文本阴影将设置动画,但颜色将不设置动画。如何让它们同时进行动画处理?感谢您的任何答案。 问题答案: 在所有支持转换的浏览器中,转换属性以逗号分隔: 是默认的计时功能,因此您不必指定它。如果确实需要,则需要指定它: 这开始变得重复,因此,如果要在多个属性中使用相

  • 问题内容: 是否可以在CSS中选择多个具有某个特定类,id等父的元素?例如: 如果不是,是否有办法选择该元素的所有子元素? 问题答案: 是否可以在CSS中选择多个具有某个特定类,id等父的元素? 当前,不幸的是,并非没有复制整个父选择器并指定所有后代,而是1: 直到选择器3最终确定后,他们才提出了伪类表示法来进行此操作,直到最近,基本实现才开始出现。 简而言之,现在已成为标准的伪类称为。在遥远的将

  • 问题内容: 我想将一个DIV元素移到另一个元素中。例如,我要移动此对象(包括所有子对象): 到这个: 这样我有: 问题答案: 曾经尝试过普通的JavaScript … 吗?

  • 问题内容: 我试图在一个元素上拍两个或多个相同类型的注释,在这种情况下是方法。这是我正在使用的近似代码: 编译以上内容时,javac抱怨重复的注释: 这样根本不可能重复注释吗?从学步上讲,上面的两个@Foo实例是否由于内容不同而不同吗? 如果上述方法不可行,有哪些可能的解决方法? 更新:我被要求描述我的用例。开始。 我正在建立一种语法糖化机制,以“映射” POJO到文档存储(例如MongoDB)。

  • 问题内容: 我想将一个DIV元素移到另一个元素中。例如,我要移动此对象(包括所有子对象): 到这个: 这样我有: 问题答案: 曾经尝试过普通的JavaScript … 吗?