0

我正在使用 PageObject 模型来开发一个测试框架,并且我有一个实例需要一些时间才能获得新页面的 url。

场景是这样的:用户正在创建一个新对象。他们提供对象的名称并单击按钮以转到新对象的编辑页面。

我想使用单击按钮时加载的 url 构造一个 EditPage 对象。单击按钮后,驱动程序的当前 url 需要一些时间才能更新为编辑页面的新 url。

在 Selenium 2 中,处理这种情况的干净、健壮的方法是什么?到目前为止,我只遇到过特定元素无法加载到页面上的问题,但这是我第一次遇到需要长时间等待驱动程序的当前 url 更新的情况。

我已经将 FluentWait 用于加载缓慢的组件,并且我听说过 WebDriverWait。我的问题是,在这种情况下使用哪个更好?有人可以发布一个简单的例子来说明如何处理一个缓慢可用的 URL 吗?我想要一个不需要 CreatePage 知道关于 EditPage 上的元素的任何内容的解决方案,因此涉及等待 EditPage 上的元素可见的策略违反了封装原则。

4

1 回答 1

1

这是一个常见的问题,因为页面将等待可变的加载时间,并且您的页面对象需要考虑到这一点。页面对象应该有一个内置的机制来等待自己在您首选的分配时间内加载,这样如果您确实抛出异常,您就会知道这是因为 1) 请求的页面实际上没有显示或 2) 花费了太长时间. 您可以在每种情况下抛出不同的异常,以区分测试失败的原因。

在您的情况下,我认为最好的办法是让您的页面对象等待一定的时间,以便 URL 与相关页面对象的 URL 匹配。因此,作为加载过程的一部分,页面对象可以调用如下方法:

public PageObject WaitForURL(string url)
{
    Console.WriteLine("WaitForURL : " + url);
    WebDriverWait _waitForURL = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(30000));
    _waitForURL.Until((d) =>
    {
        try
        {
            return d.Url == url;
        }
        catch (Exception)
        {
            return false;
        }
    });
    Console.WriteLine("URL changed to : " + _driver.Url);

    return this;
}

请注意,即使 URL 已更改为您想要的 URL,这并不意味着页面已完成加载。您说您不想等待特定元素,我理解这一点,但是您可能希望在上述内容之后进行简单的等待以使 body 标记可见,或者确保在与页面对象的元素交互之前首先你首先开始等待元素可见的时间。

于 2013-05-08T03:14:41.123 回答