webdriver模式窗口click()不起作用 [英] webdriver modal window click() not working

查看:59
本文介绍了webdriver模式窗口click()不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在四处寻找解决方案,但到目前为止,没有一个解决方案对我有用.

I've been browsing around trying to find a solution to this but none of the solutions have worked for me thus far.

这是我拼凑起来的一个快速测试,它只是尝试单击关闭"按钮来关闭模态弹出窗口.我可以在 Visual Studio 中逐步完成我的测试,它会正常工作.当我在 Nunit 中运行测试时,它会出错.我根据其他问题和提供给他们的建议尝试了以下方法:-

Here is a quick test I've thrown together where its simply trying to click the 'close' button to close a modal pop up. I can step through my test in Visual Studio and it will work fine. When I run the test in Nunit, it will error. I've tried the following based upon others issues and suggestions given to them:-

  • 到处等待
  • 从 Chrome 驱动程序更改为 Firefox
  • 更改为最大化窗口模式
  • 以我能想到的各种方式重新设计

模态不是 iframe 或类似的东西.我似乎收到以下错误:

The modal is not an iframe or anything like that. I seem to be getting the following error:

调用的目标已抛出异常.----> System.InvalidOperationException : 元素在点 (922.5, 342.0999755859375) 处不可点击.其他元素会收到点击:

Exception has been thrown by the target of an invocation. ----> System.InvalidOperationException : Element is not clickable at point (922.5, 342.0999755859375). Other element would receive the click:

这就是我摆弄最大化和正常尺寸模式的原因.

which is why I was fiddling with maximised and normal sized modes.

寻找任何建议,因为它让我难住了..

Looking for any suggestions as it's got me stumped..

谢谢

[Test(Description = "Test to check if the cancel button closes the modal window when clicked on the 'Reset Password' modal")]
    public void CheckCancelPasswordResetOnModalWorks()
    {
        bool modalFoundSuccess = false;
        bool forgotPasswordControlFound = false;
        _driver.Navigate().GoToUrl(_baseURL + "login");

        if (_loginPage.CheckForgotPasswordControlExists())
        {
            forgotPasswordControlFound = true;

            _loginPage.ClickForgotPasswordButton();

            if (_loginPage.CheckResetPasswordModalIsDisplayed())
            {
                modalFoundSuccess = true;
                _loginPage.ClickCancelResetPasswordButton();
                if (_loginPage.CheckResetPasswordModalIsDisplayed() != true)
                {
                    modalFoundSuccess = false;
                }
                Assert.IsFalse(modalFoundSuccess, "The modal window did not close when the 'cancel' button was clicked on the modal pop up");
            }
            Assert.IsTrue(forgotPasswordControlFound, "Could not find the 'Forgotten Password' Modal box on the page");
        }
        Assert.IsTrue(forgotPasswordControlFound, "Was not able to find the 'Forgot Password' button on the '/login' page.");
    }

<小时>

页面项目


Page Item

public class LoginPage : Page
{
    private IWebDriver _driver;
    public string userNameValidationText = "Username must be filled in.";
    public string passwordValidationText = "Password must be filled in.";
    public string incorrectLoginValidationText = "The user name or password is incorrect";

    [FindsBy(How = How.ClassName, Using = "scfForm")]
    private IWebElement _WFFMForm;

    [FindsBy(How = How.XPath, Using = "//div[@class='scfSubmitButtonBorder']/input")]
    private IWebElement _loginButton;

    [FindsBy(How = How.XPath, Using = "//div[@class='scfSingleLineGeneralPanel']/input")]
    private IWebElement _userNameField;

    [FindsBy(How = How.XPath, Using = "//div[@class='scfPasswordGeneralPanel']/input")]
    private IWebElement _passwordField;

    [FindsBy(How = How.XPath, Using = "//div[@id='divForgotPassword']")]
    private IWebElement _resetPasswordModal;

    [FindsBy(How = How.XPath, Using = "//div[@id='divForgotPassword']/p/input")]
    private IWebElement _forgotPasswordEmailInputField;

    [FindsBy(How = How.XPath, Using = "//div[@id='divForgotPassword']/a[contains(., 'Reset My Password')]")]
    private IWebElement _resetPasswordButton;

    [FindsBy(How = How.XPath, Using = "//div[@id='divForgotPassword']/a[contains(., 'Cancel')]")]
    private IWebElement _cancelResetPasswordButton;

    [FindsBy(How = How.XPath, Using = "//div[@class='forgot-password']/a[contains(., 'Forgot Password')]")]
    private IWebElement _forgotPasswordButton;

    public LoginPage(IWebDriver driver)
        : base(driver)
    {
        _driver = driver;
        PageFactory.InitElements(_driver, this);
    }

    public void InputUserNameText(string phoneText)
    {
        _userNameField.Clear();
        _userNameField.SendKeys(phoneText);
    }

    public void InputPasswordText(string queryText)
    {
        _passwordField.Clear();
        _passwordField.SendKeys(queryText);
    }

    public void InputResetPasswordEmail(string resetEmail)
    {
        _forgotPasswordEmailInputField.Clear();
        _forgotPasswordEmailInputField.SendKeys(resetEmail);
    }

    public void ClickLoginButton()
    {
        _loginButton.Click();
    }

    public void ClickResetButton()
    {
        WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(10));
        wait.Until((d) => { return CheckModalHasLoaded(); });
        _resetPasswordButton.Click();
    }

    public void ClickCancelResetPasswordButton()
    {
        WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(20));
        wait.Until((d) => { return CheckModalHasLoaded(); });
        _cancelResetPasswordButton.Click();
    }

    public void ClickForgotPasswordButton()
    {
        _forgotPasswordButton.Click();
    }

    public void ClickLoginButtonForEmtpyValidation()
    {
        _loginButton.Click();
        WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(10));
        wait.Until((d) => { return CheckValidationTopBoxExists(); });
    }

    public bool CheckValidationForIncorrectLoginExists()
    {
        return Utility.IsThisElementPresent(_driver, By.XPath("//div[@class='scfSubmitSummary']/span"));
    }

    public bool loginFormExistsCheck()
    {
        return Utility.IsThisElementPresent(_driver, By.ClassName("scfForm"));
    }

    public bool CheckValidationTopBoxExists()
    {
        return Utility.IsThisElementPresent(_driver, By.ClassName("scfValidationSummary"));
    }

    public bool CheckResetPasswordModalIsDisplayed()
    {
        return Utility.IsThisElementPresent(_driver, By.XPath("//div[@id='divForgotPassword']"));
    }

    public bool CheckForgotPasswordControlExists()
    {
        return Utility.IsThisElementPresent(_driver, By.ClassName("forgot-password"));
    }

    public bool CheckModalHasLoaded()
    {
        return Utility.IsThisElementPresent(_driver, By.XPath("//div[@id='divForgotPassword']"));
    }

}

推荐答案

如果模态已经在 DOM 中(即未通过 ajax 加载),您可能需要更改它以等待元素可见(假设模态是隐藏的).这是因为元素始终存在,只是不可见.这解释了为什么当您在调试模式下单步执行时它也能工作.

If the modal is already in the DOM(ie. not loaded via ajax) you may need to change it to wait for element visible (assuming the modal is hidden). This is because the element is present always, just not visible. This explains why it works when you step through it in debug mode also.

尝试使用类似的东西

WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//div[@id='ElementYouWantToTarget']")));

这篇关于webdriver模式窗口click()不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆