Java 使用HtmlUnit登录到Google帐户
我正试图通过HtmlUnit登录到谷歌账号,但仍然有问题,我得到了登录页面。我做错了什么Java 使用HtmlUnit登录到Google帐户,java,parsing,web-scraping,htmlunit,Java,Parsing,Web Scraping,Htmlunit,我正试图通过HtmlUnit登录到谷歌账号,但仍然有问题,我得到了登录页面。我做错了什么 设置电子邮件 单击下一步按钮 设置密码 单击登录按钮 转到GMail页面,它仍然是登录页面(下面的输出) 我的示例代码: WebClient client = new WebClient(BrowserVersion.CHROME); client.setHTMLParserListener(HTMLParserListener.LOG_REPORTER);
WebClient client = new WebClient(BrowserVersion.CHROME);
client.setHTMLParserListener(HTMLParserListener.LOG_REPORTER);
client.setJavaScriptEngine(new JavaScriptEngine(client));
client.getOptions().setJavaScriptEnabled(true);
client.getCookieManager().setCookiesEnabled(true);
client.getOptions().setThrowExceptionOnScriptError(false);
client.getOptions().setThrowExceptionOnFailingStatusCode(false);
client.setAjaxController(new NicelyResynchronizingAjaxController());
client.getCache().setMaxSize(0);
client.getOptions().setRedirectEnabled(true);
String url = "https://accounts.google.com/login?hl=en#identifier";
HtmlPage loginPage = client.getPage(url);
client.waitForBackgroundJavaScript(1000000);
HtmlForm loginForm = loginPage.getFirstByXPath("//form[@id='gaia_loginform']");
List<HtmlInput> buttonInputs = loginForm.getInputsByValue("signIn");
HtmlInput nextButton = Iterables.getFirst(buttonInputs, null);
HtmlInput loginButton = Iterables.getLast(buttonInputs);
Thread.sleep(2000);
//setup email
HtmlInput emailInput = loginForm.getInputByName("Email");
emailInput.setValueAttribute(emailAddress);
Thread.sleep(2000);
//click next button
nextButton.click();
client.waitForBackgroundJavaScript(1000000);
Thread.sleep(2000);
//setup password
HtmlInput passwordInput = loginForm.getInputByName("Passwd");
passwordInput.setValueAttribute(password);
//click login button
loginButton.click();
client.waitForBackgroundJavaScript(1000000);
Thread.sleep(2000);
HtmlPage gmailPage = client.getPage("https://mail.google.com/mail/u/0/#inbox");
log.info(gmailPage.asText());
我忘了一些明显的事情
我还尝试用javascript单击按钮
loginPage.executeJavaScript("document.getElementById('next').click()");
loginPage.executeJavaScript("document.getElementById('signIn').click()");
我认为你做错的是当你在寻找“下一步”和“登录”按钮时 我很确定你需要做:
List buttoninput=loginForm.getInputsByName(“登录”)代码>
相反,你把
List buttoninput=loginForm.getInputsByValue(“登录”)代码>
这是不对的,因为两个按钮的名称都是“登录”
当“下一步”按钮的值为“下一步”且“登录”按钮的值为“登录”时,我认为您所做的错误是在查找“下一步”和“登录”按钮时
我很确定你需要做:
List buttoninput=loginForm.getInputsByName(“登录”)代码>
相反,你把
List buttoninput=loginForm.getInputsByValue(“登录”)代码>
这是不对的,因为两个按钮的名称都是“登录”
当“下一步”按钮的值为“下一步”而“登录”按钮的值为“登录”时,那么,谷歌登录似乎会触发很多重定向。我建议您打印当前页面URL以查看您所在的位置,并在匿名模式下与您选择的浏览器进行比较。事实上,你完全有可能登录谷歌。你也可以尝试导航到一个经过身份验证的页面(通常是GMail),看看你是否被禁止https://mail.google.com/mail/u/0/#inbox");代码>log.info(gmailPage.asText())代码>我将客户端重定向到gmail页面,我得到的输出是登录page@Jakub_Pomykała我的错。您是否尝试过使用HTTP代理来查看HtmlUnit和Google之间交换了哪些HTTP请求?也许你会发现你的浏览器在登录时有一些有趣的不同。不,你能说得更多吗?代理应该指向哪里?到我的电脑?我认为我可以使用wireshark做同样的事情,而不使用HTTP代理。是的,你当然可以使用wireshark来监听流量,但我不太擅长推荐;-)因此,启动Wireshark,运行HtmlUnit测试,然后使用浏览器执行相同的身份验证。差异应该是可见的。好吧,谷歌登录似乎触发了很多重定向。我建议您打印当前页面URL以查看您所在的位置,并在匿名模式下与您选择的浏览器进行比较。事实上,你完全有可能登录谷歌。你也可以尝试导航到一个经过身份验证的页面(通常是GMail),看看你是否被禁止https://mail.google.com/mail/u/0/#inbox");代码>log.info(gmailPage.asText())代码>我将客户端重定向到gmail页面,我得到的输出是登录page@Jakub_Pomykała我的错。您是否尝试过使用HTTP代理来查看HtmlUnit和Google之间交换了哪些HTTP请求?也许你会发现你的浏览器在登录时有一些有趣的不同。不,你能说得更多吗?代理应该指向哪里?到我的电脑?我认为我可以使用wireshark做同样的事情,而不使用HTTP代理。是的,你当然可以使用wireshark来监听流量,但我不太擅长推荐;-)因此,启动Wireshark,运行HtmlUnit测试,然后使用浏览器执行相同的身份验证。差异应该是显而易见的。
loginPage.executeJavaScript("document.getElementById('next').click()");
loginPage.executeJavaScript("document.getElementById('signIn').click()");