对象初始化是SOM中POM和Page Factory之间的唯一区别吗?


回答 1:

以下信息来自initElements()方法的PageFactory类JavaDoc:

公共静态 T initElements(WebDriver驱动程序,类 pageClassToProxy){T页面= InstantiatePage(驱动程序,pageClassToProxy); initElements(驱动程序,页面); 返回页面; }
  • 实例化给定类的实例,并为每个WebElement和List设置一个惰性代理。 假设字段名称也是HTML元素的“ id”或“ name”,则声明的字段。

这意味着对于该类:

公共类Page {private WebElement提交; }

可以使用xpath表达式定位元素

// * [@ id ='submit']“或// * [@ name ='submit']
  • 默认情况下,每次调用元素或列表时都会对其进行查找。 要更改此行为,只需使用CacheLookup批注对字段进行批注。要更改元素的定位方式,请使用FindBy批注。

——————————————————————————————

因此,当使用PageFactory时,

  1. WebElement或列表 变量在页面对象类中被声明为私有变量如果WebElement变量与Web元素id或name属性具有相同的名称,则无需为该元素指定定位符,否则,该元素定位符由FindBy注解initElements()方法指定为页面对象类中的每个Web元素设置一个惰性代理; 该代理将Web元素与其定位符相关联; 但是使用元素时仍未搜索到Web元素(通过在其上调用诸如click(),getText(),isEnabled()等方法),会发生以下情况:在页面类期间与Web元素关联的定位器检索初始化,如果找到元素,则在浏览器dom中搜索该元素,如果您不希望每次使用该元素在浏览器dom中进行搜索,则代码与之交互,可以使用CacheLookup批注; 在这种情况下,元素在第一次被发现后被缓存

这只是Page Factory的简短故事。

阅读代码并尝试理解其工作方式非常有益。

这确实让我感到惊讶,因为要了解代码的作用,我必须学习一些我不了解的东西,例如

  • 泛型反射延迟初始化代理类

花了一段时间才弄清楚,但我很高兴自己做到了。

祝好运!

喜欢这篇文章,想了解更多吗?

查看我的新Quora博客:

硒提示和技巧


回答 2:

在POM(页面对象模型)中,您为每个新页面/ URL创建一个新类,并将所有元素标识方法放入其中。

Page Factory是硒中的注释,您可以将其提供给课程。 因此,当您将任何类定义为页面工厂时,将在调用该类中的任何元素时加载该类中的所有元素。 钍

PS-如果您在一堂课中拥有大量元素并且仅使用一个元素,那么Page Factory似乎是一种非常糟糕的做法。