1

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

类登录页面
{
    私有 IWebDriver 驱动程序;

    公共登录页面(IWebDriver 驱动程序)
    { this.driver = 司机; }

    //登录成功后出现首页
    public HomePage DoLogin(string user, string pass)
    {
        driver.FindElement(By.Name("userfield")).SendKeys(user);
        driver.FindElement(By.Name("passfield")).SendKeys(pass).Submit();

        //上面是什么失败了,我留在登录页面上?返回 HomePage 对象在这里不是一个好主意

        主页主页 = 新主页(驱动程序)
        PageFactory.InitElements(驱动程序,主页)
        返回首页;
    }
}

类主页{
    公共主页(WebDriver 驱动程序)
    { this.driver = 司机; }

    公共无效点击退出按钮()
    {
        退出按钮.click();
    }

    公共登录页面注销()
    {
        点击退出按钮();

        LoginPage 登录页面 = 新的登录页面(驱动程序)
        PageFactory.InitElements(驱动程序,登录页面);
        返回登录页面;
    }
}

我的问题:

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

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

谢谢!

4

2 回答 2

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)。您对页面检查的严格程度取决于您想要的准确性和灵活性。

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

于 2012-04-06T15:22:41.880 回答
0

对于您的第一个问题:如果 Selenium 无法找到“用户字段”或“密码字段”,它将不会返回主页对象。

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

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

在我看来,这就是为什么让你的集成测试尽可能地分开是有益的。确保在测试您要确保有效的行为时不涉及太多设置工作。

我还发现这种扩展方法对于确保特定元素不在页面上非常有用。请记住,这种扩展方法会成为 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"));
于 2012-04-10T15:24:25.500 回答