我想创建一个使用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异常。我尝试按标签打印元素(输入和),但返回空[]。
任何人都可以指导进行哪些更改或添加,以便我可以添加电子邮件/密码组合并登录?
答案 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()来转储您正在使用的页面的代码。