繁体   English   中英

在页面对象模型设计中如何使用硒ExpectedConditions?

[英]How do you use selenium ExpectedConditions in a page object model design?

希望我不是第一个遇到此问题的人。

我正在用C#编写一些硒测试,在尝试对页面对象模型设计进行验证时遇到了一个难题,同时还需要对ExpectedConditions类进行一些明确的等待。

假设我将元素存储在元素映射类中,该元素映射类只是使用存储在资源文件中的XPath调用.FindElement方法的属性...

public class PageObject {

    public IWebElement Element
    {
        get { return DriverContext.Driver.FindElement(By.XPath(Resources.Element)); }
    }
}

然后,我将继续在各种硒方法中使用该属性。

我遇到的问题是,我还需要检查此元素在页面上是否可见,并且在执行检查之前它将出错(例如,使用WebDriverWait,将ExpectedConditions.ElementIsVisible(by)传递给.until方法)。

如何干净地将IWebElement和“按”定位符分开,并在需要的地方进行明确的等待/检查?

TLDR-如何维护页面对象模型设计,同时还能灵活地基于元素的“按”定位符使用显式等待。

非常感谢,

我一直使用页面对象,但是在类的顶部有定位符,而不是元素。 然后,根据需要使用定位器单击按钮等。 这样做的好处是,我仅在需要时访问页面上的元素,以避免过时的元素异常等。请参见下面的简单示例。

class SamplePage
{
    public IWebDriver Driver;
    private By waitForLocator = By.Id("sampleId");

    // please put the variable declarations in alphabetical order
    private By sampleElementLocator = By.Id("sampleId");

    public SamplePage(IWebDriver webDriver)
    {
        this.Driver = webDriver;

        // wait for page to finish loading
        new WebDriverWait(Driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(waitForLocator));

        // see if we're on the right page
        if (!Driver.Url.Contains("samplePage.jsp"))
        {
            throw new InvalidOperationException("This is not the Sample page. Current URL: " + Driver.Url);
        }
    }

    public void ClickSampleElement()
    {
        Driver.FindElement(sampleElementLocator).Click();
    }
}

我建议不要将定位符存储在单独的文件中,因为它会破坏页面对象模型的口头禅,这与页面对象中的所有内容有关。 您无需打开任何文件,只需使用一个文件即可对Page X(页面对象类)进行任何操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM