【问题标题】:Selenium wait for user captcha input C#Selenium 等待用户验证码输入 C#
【发布时间】:2014-11-26 07:55:58
【问题描述】:

我是 Selenium 的新手,使用 C# 登录页面,该页面由用户名、密码和验证码组成。 问题是,对于验证码,它必须等待用户输入并手动提交表单。 我不知道在这个问题上什么解决方案是正确的。 请问有没有更好的办法?

这是我的代码。

        var driver = new FirefoxDriver();
        driver.Navigate().GoToUrl("http://someonewebite.com/");

        IWebElement usernameInput = driver.FindElement(By.Name("txtUserName"));
        IWebElement passwordInput = driver.FindElement(By.Name("txtPassword"));

        usernameInput.SendKeys("username");
        passwordInput.SendKeys("password");

        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
        wait.Until((d) =>
        {
            return (bool)((RemoteWebDriver)d).ExecuteScript("return document.body.className.match(/\submittedpage\b/).length");
        });

【问题讨论】:

  • 能否请您定义您希望用户如何输入验证码数据?也许您可以获取图像并将其显示在作为对话框打开的 UserControl 中?这样主线程将被阻塞,直到表单关闭。
  • 所以您只想等待验证码显示?你能做的最多就是等待它的底层元素被显示出来,但这并不意味着它里面的实际文本就在那里。在某些 CAPTCHA 中,他们可以将一个元素放入 DOM 并用异步请求填充它。所以你没有确切的方式来说“这个 CAPTCHA 在那里,里面有什么东西吗?”

标签: c# selenium


【解决方案1】:

据我所知,我们无法在 selenium 中自动化验证码……验证码的主要优点是它不能被任何自动化语言破坏,这就是它的用途。

【讨论】:

  • 我不想通过验证码,我想等待用户验证码并手动提交表单。
  • 只是为了确保我以正确的方式理解你你能实现 Thread.sleep(5000);将 sendKeys() 传递给用户名和密码输入字段后,是否可以使用手动等待?
【解决方案2】:

如果您在没有手动交互的情况下无法登录,我认为您使用 WebDriverWait 的方法是一种很好的方法——您为什么要更改它? 但是您不必使用 JavaScript 来识别您是否已成功登录。也可以在传递给 wait.Until() 的谓词中使用任何 WebDriver 方法。 因此,您还可以执行以下操作:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
wait.Until((d) =>
{
    return d.FindElement(…); // here you can use any locator that identifies a successful / failed login
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多