这是我在这里的第一篇文章,如果我 做任何不常见的事情。 我要做什么-我正在编写Java代码来创建一个使某些程序自动化的机器人 网站研究,这需要在Java下完成。我选择了HtmlUnit,这是第一个可用的选项。所需的任务是:登录网站,浏览页面,找到一些html元素(按钮),然后单击按钮。 我能够解决所有挑战,部分挑战来自上一个挑战-无法点击 在按钮上。实际上,我可以-代码以点击的形式运行,没有异常或警告,但没有实际的点击发生-不知道,为什么并且不能进行故障排除。我什至试图在自由职业者身上发布一份工作来纠正这个谜团,但是人们甚至都无法访问该网站或提出想法,无论如何这些对我来说都没有用。对HtmlUnit电子邮件列表的支持已死,那里没有任何响应,所以我来这里是最后的选择,也许有人可以帮忙或给我适当的想法。好的,我在最终的html页上的内容如下:
<div class="optin1">
<button class="optin1" data-role="optin-button" data-id="1" data-code="P1" data-response="1">
You are Opted Out
</button>
</div>
<div class="optin1">
<button class="optin1" data-role="optin-button" data-id="2" data-code="P2" data-response="1">
You are Opted Out
</button>
</div>
重要-没有表单或提交按钮,这些按钮(我需要单击)不在任何表单内。这些按钮没有ID或名称,因此要找到它们-是另一项艰巨的任务,但我设法做到了。
然后我有如下的Java代码(具有HtmlUnit设置):
import java.io.*;
import java.sql.*;
import java.util.*;
import java.math.BigDecimal;
import java.util.regex.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import java.util.Optional;
import java.util.logging.Level;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.HtmlEmailInput;
import com.gargoylesoftware.htmlunit.javascript.host.event.MouseEvent;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
//-----------------------------------------------------------------------------
public class Dogespin {
public static void main (String args[]) throws SQLException, IOException, Exception {
try {
if ( 1 == 1 ) {
Dogespin obj = new Dogespin();
obj.get_html();
return;
}
}
private HtmlPage clickButtonIgnoringVisibility(HtmlButton htmlButton) throws IOException {
MouseEvent event = new MouseEvent(htmlButton, MouseEvent.TYPE_CLICK, false, false, false, MouseEvent.BUTTON_LEFT);
return htmlButton.click(event, true);
}
//------------------------------------------------------------------------------
public int get_html() throws SQLException, IOException, Exception {
try ( final WebClient webClient = new WebClient(BrowserVersion.CHROME) ) { // try 1
// supress css errors
webClient.setCssErrorHandler(new SilentCssErrorHandler());
// disable javascript
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.waitForBackgroundJavaScript(10000);
// go to offers page
String offers_url = "https://www.someURL.com";
// Get offers page
final HtmlPage page3 = webClient.getPage(offers_url);
List<HtmlButton> buts = page3.getByXPath("//button[@class='optin1']");
int list_size = buts.size();
for (int i = 0; i < list_size; i++ ) {
if ( (buts.get(i)).getAttribute("data-id").equals("1") ) {
LogUtil.Wwrite("477 list_element[" + i + "] getAttribute=" + (buts.get(i)).getAttribute("data-id"), logUtil, 1);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.waitForBackgroundJavaScriptStartingBefore(1000);
//buts.get(i).click();
//buts.get(i).click(false, false, false, true, true, true);
HtmlPage tokenPage = clickButtonIgnoringVisibility(buts.get(i));
webClient.waitForBackgroundJavaScriptStartingBefore(10000);
LogUtil.Wwrite("485 click()", logUtil, 1);
}
} // end for
别急于LogUtil-这只是我的日志编写器。 所以,发生了什么-我能够找到所有必需的按钮 通过这段代码getByXPath(“ // button [@ class ='optin1']”) 并且它是正确的(我已经对其进行了三遍检查),然后-选择所需的按钮 最后-我试图通过HtmlUnit中所有可用的方法click()来单击此血腥按钮:
click() 点击(带有一组参数) clickButtonIgnoringVisibility()-使用一些特殊的覆盖方法
我还尝试了所有可能的click()按钮示例,如本参考书https://www.programcreek.com/java-api-examples/index.php?api=com.gargoylesoftware.htmlunit.html.HtmlButton中所述
没有运气。 代码正在运行,应运行的click()方法正在运行,但未触发 实际的click()事件。我检查此内容的唯一方法-手动登录该网站并查看那里发生了什么-应该在那里发生了什么,但事实并非如此。 对我来说,这是一个谜,唯一的假设是,这不是标准的html提交按钮。 顺便说一句,通常的提交按钮(在通常的html表单内)上的简单click()事件在此确切的网站上工作正常(我正在使用此技术进行登录),因此这不是网站的问题。花了几天时间在这个谜上并已经放弃了-在寻求一些新主意方面寻求帮助,也许以前有人遇到过类似的问题。 我必须打开和关闭JavaScript-作为一种变通方法,无法访问启用了JavaScript的网站,需要先将其关闭,然后-尝试将其打开(希望对您有所帮助)-但没有运气。