页面对象模型中的显式等待

时间:2013-04-15 11:06:50

标签: c# webdriver selenium-webdriver

我正在尝试使用页面对象模型中的显式等待来测试单个页面应用程序,我面临的问题是,当页面被调用时,显式等待开始检查元素,因为页面完全是动态的某些元素仅在某个操作后出现。由于元素甚至在创建之前就被检查过,因此总是会出现错误“No such Element exception” 示例代码:

    public class example
    {

    private IWebElement ExampleElement = wait.Until<IWebElement>((d) =>
                {
                    return d.FindElement(By.Id("ExampleElement ID"));
                });
private IWebElement ExampleElement2 = wait.Until<IWebElement>((d) =>
                {
                    return d.FindElement(By.Id("ExampleElement ID"));
                });

    public void example1()
    {
    ExampleElement.click();
    ExampleElement2.click();
    }
    } 

    public class exampleTest
    {
    [Test]
    public void SomeTest()
    {
    example.example1();
    }
    }

ExampleElement2仅在ExampleElement单击之后加载,但是发生的事情是它甚至在单击操作之前一直检查ExampleElement2,因此它无法找到它并且它给出了异常。事情是,我甚至不希望元素在它被要求之前检查是否存在。

我是全新的,提前谢谢

2 个答案:

答案 0 :(得分:1)

这里似乎有一个模式问题。您的WebElements属于类级别,因此当启动类的实例时,webdriver正在尝试初始化所有内容,因此甚至等待Element2。如果Element2是动态的,那么你不能在类级别等待它。在您希望它出现的条件之后等待它。

我会说只是在班级,

private IWebElement ExampleElement2;

然后,做

 public void example1()
    {
    ExampleElement.click();
    ExampleElement2 = wait.Until<IWebElement>((d) =>
                {
                    return d.FindElement(By.Id("ExampleElement ID"));
                });
    ExampleElement2.click();
    }

您也可以查看PageFactory。您不希望在代码中重复driver.findElement以及其他明显的优势: - )。

答案 1 :(得分:0)

正如nilesh在他的回答中所提到的,需要推迟加载ExampleElement2。但是它应该是一个明确的等待,你需要等待相关的预期条件,例如你可以说等到ElementIsVisible(在Java API中你可以根据元素类型设置elementToBeClickable等特定条件)。然后它确保元素满足您传递的特定条件。

P.S - 对不起,我无法帮助您完成代码段。由于我是一个Java人,我没有使用C#进行过任何Selenium测试。但原则是一样的。