Selenium对编码实践的关注

时间:2012-04-06 13:47:55

标签: c# object selenium

我是Selenium的新手,经过大量研究,我已经停止了。我已经看到了各种代码,其代码类似于我在下面的代码:

class LoginPage
{
    private IWebDriver driver;

    public LoginPage(IWebDriver driver)
    { this.driver = driver; }

    //HomePage appears when Login successful
    public HomePage DoLogin(string user, string pass)
    {
        driver.FindElement(By.Name("userfield")).SendKeys(user);
        driver.FindElement(By.Name("passfield")).SendKeys(pass).Submit();

        //what is the above fails and i stay on the LoginPage? returning a HomePage object will be a bad idea here

        HomePage homepage = new HomePage(driver)
        PageFactory.InitElements(driver, homepage)
        return homepage;
    }
}

class HomePage{
    public HomePage(WebDriver driver)
    { this.driver = driver; }

    public void clickExitButton() 
    {
        exitButton.click();
    }

    public LoginPage logout() 
    {
        clickExitButton();

        LoginPage loginpage = new LoginPage(driver)
        PageFactory.InitElements(driver, loginpage);
        return loginpage;
    }
}

我的问题:

  1. 哪一个课程没有做到他们应该做的事情?如果登录失败怎么办?它仍将返回HomePage对象。情况应该不是这样,对吧?如何应对失败可以做些什么?我见过的大多数例子都假设事情“会”正确地解决。

  2. 上述实现对C#是否正确?我见过的大多数示例都是针对Java的 - 只是想将它们转换为C#,因为我知道C#:)

  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

对于您的第一个问题,我之前解决的方法是在每个页面类中包含一个函数,该函数指示Selenium当前是否在预期的页面上。例如,Homepage类将具有类似的内容:

public bool IsCurrentPage()
{
    try
    {
        driver.FindElement(By.LinkText("Logout"));
    }
    catch (Exception)
    {
        return false;
    }
    return true;
}

因此,当您创建新的Homepage时,会立即检查它是否有效:

HomePage homepage = new HomePage(driver);
if (!homepage.IsCurrentPage())
   throw new Exception("Invalid homepage object");

然后您可以以任何适合您目的的方式自由处理不匹配。当然该方法可能被欺骗,因此另一个选项是检查页面名称的URL(例如homepage.html)。您对页面检查的严格程度取决于您想要的准确性和灵活性。

对于你的第二个问题,除了一对缺少分号外,代码看起来还不错。

答案 1 :(得分:0)

对于您的第一个问题:如果找不到“userfield”或“passfield”,Selenium将不会返回Homepage对象。

通过使用FindElementBy(...)方法,您隐式假设这些字段必须存在。如果Selenium在页面上找不到“userfield”或“passfield”元素,则会抛出异常。在那里有效地“失败”了测试。

通常,此过程的工作方式是nUnit将启动Integration测试。如果Selenium没有找到继续所需的元素之一,那么特定的Integration测试将失败。

在我看来,这就是为什么尽可能划分集成测试是有益的。确保测试您要确保的行为所涉及的太多很多设置工作正在发挥作用。

我还发现这种扩展方法对于确保页面上的特定元素非常有用。请记住,此扩展方法属于Selenium“ImplicitWait”时间的牺牲品。这一次调用将有效地 要求 N秒后再继续。

public static class RemoteWebDriverExtensions
{
    public static bool ElementDoesNotExist(this RemoteWebDriver driver, By by)
    {
        try
        {
            var element = driver.FindElement(by);

            return false;
        }
        catch (Exception)
        {
            return true;
        }
    }
}

最终可以这样使用:

driver.ElementDoesNotExist(By.LinkText("Logout"));