使用HtmlUnit登录和密码帮助

时间:2017-01-14 05:08:28

标签: java html htmlunit

我想创建一个使用Java中的HtmlUnit登录网站的简单任务。从我搜索过的所有内容中,通常人们都有要搜索的元素名称或ID。但是在我的特定情况下,没有一个。当我点击网站上的用户名/密码字段并点击inspect(chrome)时,这就是我得到的:

<input type="email" class="js-email form-control input-lg" placeholder="Enter email">
<input type="password" class="js-password form-control input-lg" placeholder="Enter password">

<button type="submit" class="js-login btn btn-success btn-lg" style="width: 140px" disabled="">
<span class="vs-login-text">Log In</span><i class="vs-spinner fa fa-refresh fa-spin"></i>
</button>

相应的XPath是:=

 //*[@id="login"]/div[3]/form/div[2]/input[2]

这是我在线引用的Java代码:

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlOption;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSelect;
import com.gargoylesoftware.htmlunit.html.*;
import java.util.*;
public class V1 {

public static void main(String[] args) throws Exception{

    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage("Site address");

    //Trying something here
    final List<?> divs = page.getElementsByTagName("<input>");
    System.out.println("It is: " + x);


    HtmlElement usrname = page.getElementByName("email");
    usrname.click();
    usrname.type("myusername@123.com");

    HtmlElement psswrd = page.getElementByName("password");
    psswrd.click();
    psswrd.type("mypassword");

    HtmlElement signin = page.getElementByName("submit");
    signin.click();
    System.out.println(page.getTitleText());
    webClient.close();;
}

手头的任务很简单,但是,因为我无法获取元素名称/ id,所以上面没有工作并且抛出Element not found异常。我尝试按标签打印元素(输入和),但返回空[]。

任何人都可以指导进行哪些更改或添加,以便我可以添加电子邮件/密码组合并登录?

2 个答案:

答案 0 :(得分:0)

尝试按xpath

访问元素
HtmlTextInput email = (HtmlTextInput) page.getByXPath("//*[@id='login']/div[3]/form/div[2]/input[2]").get(0);
email.setValueAttribute("email");
HtmlPasswordInput password = (HtmlPasswordInput) page.getByXPath(" //*[@id='login']/div[3]/form/div[2]/input[3]").get(0);
password.setValueAttribute("password");

HtmlButton submitButton = (HtmlButton) page.getByXPath("yourXPath").get(0);
page = submitButton.click();

我不确定这些xpath是否正确,您应该在页面的html中重新检查它们。

答案 1 :(得分:0)

关于getElementsByTagName() 您必须使用标记名称(而不是整个标记),例如

final List<?> divs = page.getElementsByTagName("input");

关于网页。如果您使用真实的浏览器打开页面,您将看到一个启动页面,它可以执行一些js魔术。一段时间后,页面将替换为登录屏幕。 你必须或多或少地使用HtmlUnit。

final HtmlPage page = webClient.getPage("Site address");

将返回初始页面。通常javascript启动异步。所以你必须等待它完成。并注意,javascript可能已经被另一个页面替换(例如,进行重定向)。通过询问窗口来获取当前页面是个好主意。 此外,您可以使用page.asXML()来转储您正在使用的页面的代码。