猿问

Selenium PageFactory.InitElements如何工作

我正在使用Selenium Page工厂,并且我想对其进行某些扩展,但是由于它们是密封的,所以不能,因此我想编写自己的自定义逻辑。


问题:PageFactory.InitElements如何工作,以便所有属性在使用它们时(而不是在调用此方法时)加载它们的值。


所以,用一个例子来解释


    //// Button on page load 

    [FindsBy(How = How.CssSelector, Using = "#lst-ib")]

    public IWebElement Btn;


    //// Button redirecting to Page 2

    [FindsBy(How = How.CssSelector, Using = "#lst-ib")]

    public IWebElement LinkBtn;


    ////Button on second page

    [FindsBy(How=How.CssSelector, Using = "#rso > div:nth-child(1) > div > div:nth-child(1) > div > div > h3 > a")]

    public IWebElement NewBtn;

因此,其页面工厂的美妙之处在于,所有元素都已加载,但在使用时它们会转换为Webelements,因为如果所有属性在初始化时都分配了值,NewBtn属性将始终失败,如第2页所示。


因此,他们可能会使用什么概念来初始化属性,以便在使用时分配它们,而不是在运行时分配它们,因此任何虚拟代码都将非常有用,希望您理解


一只名叫tom的猫
浏览 321回答 2
2回答

扬帆大鱼

创建页面对象时,“页面对象逻辑”(IMO,根据我的经验以及到目前为止对c#和selenium的了解),它期望元素映射中提到的所有元素都存在于DOM中。如果您的NewBtn存在于圆顶中但被隐藏(并且在导航到第二页时可见,基本上是在该页面没有刷新且有一些ajax时可见),则这是因为元素映射将不具有处理元素时遇到任何问题。您只需要使用IF语句确保该元素可见,或添加一个等待(以查看您是否确实在第二页上)。如果导航到第二页时刷新了页面,则只需使用重新初始化您的页面对象,new MyPageObject()以便再次映射所有元素,以避免StaleElement和/或ElementNotFound异常等。
随时随地看视频慕课网APP
我要回答