等待元素,但元素始终存在(POM)

时间:2018-05-25 12:07:59

标签: c# selenium-webdriver

我遇到了一个关于在点击之前等待元素可见的问题。问题是,我测试所有元素的系统始终可见。因为系统永远不会改变页面只是打开弹出窗口:s。因此,如果我创建一个等待元素方法,它将始终找到元素,即使它在当时打开的窗口的背景中。

有任何人遇到这个问题并有一个很好的解决方案或代码示例我会非常感激。

编辑:如果我打开弹出框,我想返回登录页面并调用方法ClickOnArticleNumber。它会在有时间关闭弹出页面之前找到xpath,测试可能会失败,因为它甚至在右页面上调用了Click。

我希望这会解决我的问题。

    public void ClickOnArticleNumber()
    {
        waitForElement(By.XPath("xpath"), 20);
        AddArticleNumber.Click();
    }

亲切的问候

罗宾

1 个答案:

答案 0 :(得分:0)

重述我认为我理解的问题......

您的网站的主页始终处于打开状态。许多动作都是在弹出窗口中完成的......弹出窗口,你做一些动作,弹出窗口关闭。

当您在弹出窗口关闭时尝试在主页面上执行操作时,会出现问题。主页面上的元素始终存在,因为Selenium看到它并尝试操作,但该操作被弹出窗口阻止。

假设我上面说的是真的,那么在处理弹出窗口时你会非常清楚。启动弹出窗口后,您将需要等待弹出窗口可见,然后执行操作。关闭弹出窗口时,您将需要等待一些与弹出窗口相关的元素不可见,表明在基页上尝试操作之前弹出窗口不再可见。

为此,您需要为触发弹出窗口关闭的每个操作添加等待。我使用页面对象模型,所以我会做这样的事情......

弹出窗口的一些示例HTML

<div id="actionDialog" ...>
    ...
    <button id="save">Save</button>
    <button id="cancel">Cancel</button>
</div>

在这个HTML中我们有一个弹出窗口,即Action Dialog,它有两个按钮,Save和Cancel按钮。单击这些按钮之一会导致操作对话框关闭,因此我们希望在每个按钮之后添加等待。由于您可能有几个按钮会导致对话框关闭,因此您创建的方法只会等待对话框关闭,因此可以从其他方法轻松调用它并存储&#34;等待关闭& #34;逻辑在一个地方。

在ActionDialog的页面对象中,我会有几个方法:一个等待对话框关闭,另外几个方法点击保存或取消按钮。

private By actionDialogLocator = By.Id("actionDialog");
private By cancelButtonLocator = By.Id("cancel");
private By saveButtonLocator = By.Id("save");

public void Cancel()
{
    Driver.FindElement(cancelButtonLocator).Click();
    WaitForDialogToClose();
}
public void Save()
{
    Driver.FindElement(saveButtonLocator).Click();
    WaitForDialogToClose();
}
private void WaitForDialogToClose()
{
    new WebDriverWait(Driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.InvisibilityOfElementLocated(actionDialogLocator));
}

现在,当您调用Click()Save()时,脚本将等待对话框关闭,从而阻止对主页上某些元素的下一次调用失败,因为对话框将在此之前关闭尝试采取行动。