HtmlUnit下的Click()事件未在Button上触发

时间:2018-06-24 08:17:21

标签: html button click htmlunit

这是我在这里的第一篇文章,如果我 做任何不常见的事情。 我要做什么-我正在编写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的网站,需要先将其关闭,然后-尝试将其打开(希望对您有所帮助)-但没有运气。

0 个答案:

没有答案