HTMLUnit HandleAlert 和 Javascript

HTMLUnit HandleAlert and Javascript

我正在尝试登录一个我无法保证之前已经退出的网页。

如果之前的注销不成功,则会弹出 javascript 需要确认的警报,然后重新登录即可。

1:初始登录 2:确认 javascript 警报 3: 第二次登录

我可以使用网络浏览器验证它是否有效。我还可以验证我的 handleAlert 函数是否有效。但是...在我第二次尝试登录时,javascript 警报重新打开。

我不是 javascript 或网络专家。我试过清除缓存、重新加载页面、清空表单并重新设置凭据,但我无法解决这个问题。

对于我做错了什么或者我可以做些什么来解决问题有什么建议吗?

import com.gargoylesoftware.htmlunit.BrowserVersion
import com.gargoylesoftware.htmlunit.*

isError = 0

def login() {

    cancelPage = cancelButton.click()

    form = cancelPage.getFormByName("loginForm");

    userField = form.getInputByName('j_username');
    passwordField = form.getInputByName('j_password');
    submitButton = page.getElementById("loginBtnId");
    cancelButton = page.getElementById("cancelBtnId");
    userField.setValueAttribute(username);
    passwordField.setValueAttribute(password);
    submitButton = page.getElementById("loginBtnId")

    submitButton.click()

}

try
{
    if (!url.startsWith("https"))
    {
        url = "https://" + url;
    }

    conn = new WebClient(javaScriptTimeout:10000)

    conn.waitForBackgroundJavaScript(10000)
    conn.waitForBackgroundJavaScriptStartingBefore(3000)
    conn.getOptions().setJavaScriptEnabled(true);
    conn.getOptions().setCssEnabled(false);
    conn.setAlertHandler(new AlertHandler() {

        void handleAlert(Page page,String errorMessage) {

            println "\nIn handleAlert routine"

            isError = isError + 1
            if (isError == 1) {
                login()
            }

        }

    });


    //get page
    page = conn.getPage(url)
    form = page.getFormByName("loginForm");

    //get username and password form input fields and submit button
    userField = form.getInputByName('j_username');
    passwordField = form.getInputByName('j_password');
    submitButton = page.getElementById("loginBtnId");
    cancelButton = page.getElementById("cancelBtnId");

    submitButton.click()

}
catch (Exception e)
{
  println "\nFAIL - Unexpected exception: " + e.getMessage();
  for (trace in e.getStackTrace())
  {
    println "\n\t" + trace;
  }
}

警报处理程序仅用于警报对话框 - 通知您有警报。不要从警报处理程序中调用您的登录代码,您必须将此代码直接放在打开警报的点击调用之后。

更多提示:

也许这不是一个警告框,也许它是一个确认框,您需要一个确认处理程序。

查看处理程序的 javadoc 类。

让自己熟悉你正在驱动的页面,许多现代 js 库根本不使用 alert/confirm。他们使用一些 js/css 魔法来显示一些看起来像对话框但属于页面 dom 树的内容。这必须用通常的 HtmlUnit API.

来处理