根据浏览器窗口大小加载Selenium页面对象

时间:2017-03-29 13:48:30

标签: c# angularjs selenium pageobjects

我们正在构建一个Web应用程序,该页面在页面两侧具有可扩展的工作空间,可根据页面大小进行扩展和收缩。当工作场所签约时,当在Angular 2.0中开发网站时调用类时,扩展列表的页面对象不可见;

我们还在使用Selenium和C#绑定构建自动化测试框架,并使用Page Object Model来运行我们的自动化。是否可以将基于窗口的对象加载到单个页面类中,如此

public class PageObjectClass
{
    public PageObjectClass(IwebDriver driver)
    {
        PageFactory.InitElements(driver, this)
    }

    private IWebElement anObjectVisibleWhenContracted
    //load an object that is not visible based on window size
}

或者,当我调用类时,是否需要获取窗口的大小,并且在这样的测试脚本中根据窗口宽度设置单独的类?

if (driver.Manage().Window.Size.Width < 1280)
{
    someVar = new PageObjectClass(driver):
}
else
{
    someOtherVar = new exp[andedPageObjects
}
//do stuff here

2 个答案:

答案 0 :(得分:0)

如果您不希望在显示元素时遇到问题,但Selenium不与其进行交互,那么最佳做法是在setUp上最大化浏览器窗口。

如果您不想这样做,Selenium会在您与元素进行交互时滚动到元素。

所以,回答你的问题 - 你不需要改变窗口大小。如果你在C#中使用PageObject,那么当你对它进行寻址时,每个元素都会被初始化(click,sendKeys等)。每次你对一个元素进行寻址时,它都会再次初始化,Selenium必须滚动到这个元素。

但是在某些情况下,当某个元素显示在页面边缘并且Selenium无法正确滚动时,会出现一些错误。为什么会发生这种情况我不知道,但幸运的是很少发生这种情况。

答案 1 :(得分:0)

我自己想出来了。在我需要处理可扩展工作空间的类中,我在类中声明了所有变量,并且在运行PageFactory.InitElements

之前没有为它们分配任何值。

在类构造函数中,我传入了一个Size变量以及具有当前窗口大小的WebDriver。然后根据

加载适合窗口大小的对象

刚刚进行了一些重组,现在它的工作就像一个魅力。类结构现在看起来像这样

public class ClassName: InheritedClass
{

    #region Page Objects

    private IWebElement object1;
    private IWebElement object2;

    #endregion

    public ClassName(IWebDriver driver, Size winSize)
    {
        PageFactory.InitElements(driver, this);

        if (winSize.Width > 1440)
        {
            object1= driver.FindElement(expanded By phrase locator);
            object1 = driver.FindElement(expanded By phrase locator);
        }
        else
        {
            object1= driver.FindElement(contracted By phrase locator);
            object1 = driver.FindElement(contracted By phrase locator);
        }
    }

    #region Page Methods that use these objects
    #endregion
}