1

我正在尝试使用页面对象模型中的显式等待来测试单个页面应用程序,我面临的问题是显式等待在调用页面后立即开始检查元素,因为页面完全动态仅某些元素一些动作后出现。由于元素甚至在创建之前就被检查过,所以它总是会出现错误“没有这样的元素异常”示例代码:

    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,因此它无法找到它并给出异常。问题是我不希望元素在它被调用之前检查是否存在。

我是全新的,提前谢谢

4

2 回答 2

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 和其他明显的优势,这些优势不在这个主题:-)。

于 2013-04-15T15:21:11.543 回答
0

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

PS - 很抱歉,我无法通过代码片段帮助您。因为我是一个 Java 人,所以我没有使用 C# 做过任何 Selenium 测试。但原理是一样的。

于 2013-04-15T19:09:13.450 回答