我们正在构建一个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
答案 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
}