HTMLUnit:获取没有名称的按钮,id,仅键入onclick =

时间:2016-10-26 17:21:02

标签: java html-parsing htmlunit

如何在没有名称,ID或类型的情况下获得按钮 按钮?

这是我尝试管理的HTML代码:

<a class="btnv6_blue_hoverfade btn_small" href="#"   
 onclick="DoAgeGateSubmit(); return false;">
<span>Fortfahren</span>
</a>

这是我现在的代码:

package htmlParser;

import java.io.IOException;
import java.net.URL;
import org.jsoup.nodes.Element;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.RefreshHandler;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlButtonInput;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlImage;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSelect;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;

public class HitTheDamnButton
{

public static void main(String[] args) throws Exception
{
    String url = "http://store.steampowered.com/agecheck/app/72850/? snr=1_7_7_230_150_2";
    WebClient webClient = new WebClient();
    HtmlPage startPage = webClient.getPage(url);
    HtmlForm form = (HtmlForm) startPage.getElementById("agecheck_form");
    HtmlSelect dropDown1 = form.getSelectByName("ageDay");
    HtmlSelect dropDown2 = form.getSelectByName("ageMonth");
    HtmlSelect dropDown3 = form.getSelectByName("ageYear");
    dropDown1.setSelectedAttribute("2", true);
    dropDown2.setSelectedAttribute("February", true);
    dropDown3.setSelectedAttribute("1970", true);
    webClient.close();
    }
}

如何点击此按钮?我尝试了一切

HTMLButton button =  form.getButtonByName("a.btnv6_blue_hoverfade.btn_small");
... form.hasAttribute(), ... getSelectByName("name");

但没有任何效果。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

你要找的是锚而不是按钮。 尝试使用startPage.getAnchorByText或startPage.getAnchors之类的东西,然后迭代并比较类和/或文本以获得正确的。

答案 1 :(得分:0)

好的,搜索Anchor的建议导致了一些结果。 出于测试目的,我切换到另一个站点,我只需要点击一个按钮(不需要填充表格,我首先要解决简单的点按按钮问题)。我选择了这个网站:

http://store.steampowered.com/app/324800/?snr=1_7_...

它导致了“暗影勇士2”的年龄检定。 HTML代码中提到的按钮是:

<a class="btn_grey_white_innerfade btn_medium" href="#" onclick="HideAgeGate( 324800 )">ev<span>Weiter</span></a>

现在我做了,识别按钮并点击它。但我不确定“我最后点击了什么”,因为我没有被重定向到年龄检查后面的网站,而是“Shadow Warrior Classics”.... 我被引导到的新网址是:

http://store.steampowered.com/widget/238070/?dynamiclink=1

我不明白。

这是我的programmCode:

List<HtmlAnchor> anchor = startPage.getAnchors();
//  for(HtmlAnchor out : anchor)
//  {
//      System.out.println(out);
//  }
HtmlAnchor anchorButton = anchor.get(143);
System.out.println(anchor.get(143));
//  anchorButton.dblClick();
anchorButton.click();
document = Jsoup.connect(anchorButton.click().getUrl().toString()).timeout(0).get();
currentLink = startPage.getBaseURL();
url = currentLink.toString();
document = Jsoup.connect(url).timeout(0).get();
Element parentNode = document.getElementById("app_reviews_hash");
Elements childNodes = parentNode.getElementsByClass("user_reviews_filter_section");
for(Element out2 : childNodes)
{
    String all = out2.getElementsByClass("user_reviews_count").text();
    String steamPurchasers = out2.getElementsByClass("user_reviews_count").text();
    System.out.println(all);
}

的System.out.println(anchor.get(143));

显示右键:

HtmlAnchor[<a class="btn_grey_white_innerfade btn_medium" href="#" onclick="HideAgeGate( 324800 )">]

但是在我点击它之后(通过“anchorButton.click();”)我不会被引导到正确的站点。年龄检查仍然活跃...... 我仍然有一个NullPointer异常 line:

  Elements childNodes = parentNode.getElementsByClass("user_reviews_filter_section");

导致错误链接的网站不是

这样的元素
Element parentNode = document.getElementById("app_reviews_hash");

所以parentNode保持“null”。

我做错了什么?

答案 2 :(得分:0)

好的,我解决了这个问题。简而言之:我切换到Selenium WebDriver(用于JavaCode)和Selenium IDE(FireFox插件)。

________精心描述(一步一步):

1。安装Selenium IDE for FireFox-Browser:

转到:

!!! FUCK:我不允许发布链接因为我声誉不佳。只是想做一些好事,但受到了阻碍(他妈的这个世界!)!!!

ħ** PS://addons.mozilla.org/en-US/firefox/addon/selenium-ide/

(注意:用t代替两个*)

然后点击&#34; +添加到Firefox&#34; -Button。重启Firefox后, 安装将完成。 注意:可能会出现一些错误(#34; Selenium IDE&#34; -entry并没有出现在Firefox的菜单中。如果是这样, 尝试通过Firefox安装Selenium IDE-&gt;附加组件 - &gt;插件:搜索 Selenium并选择:

  • Selenium IDE 2.9.1.1签名&#34;

  • &#34;突出显示元素(Selenium IDE)&#34;

  • &#34; Selenium IDE Button 1.2.0.1-signed.1-signed&#34;

  • 在FireFoxMenu中导航到: 工具 - &GT;网络DevelopmentExtras-&GT;添加新工具: (不知道确切的术语,因为我使用的是德语版的Firefox: - &GT; Web-Entwickler-&gt; Weitere工具负载) 搜索Selenium并选择: &#34; SeleniumX&#34;

安装完成后,&#34; Selenium IDE&#34; -entry出现在firefoxMenu下的:Tools-&gt; Selenium IDE(德语:Extras)。

2。安装Selenium WebDriver for Eclipse / Dynamic WebProjects:

得到:

!!! FUCK:我不允许发布链接因为我声誉不佳。只是想做一些好事,但受到了阻碍(他妈的这个世界!)!!!

ħ**号码://www.seleniumhq.org/download/#selenium_ide

(注意:用t代替两个*)

并下载(网站上的第一部分):Selenium Standalone Server =&GT;版本3.0.1(日期:11.5.16 [月 - 日 - 年]) 下载.jar文件后,将其复制到您的 Eclipse进入以下文件夹: NameofProject \的WebContent \ WEB-INF \ lib中

注意:你可以通过&#34; Build Path-&gt;导入它。配置Build Path&#34;,但是我 更喜欢这种更快的方式。

注意:用于创建新的&#34;动态Web项目&#34;你必须安装一些 Eclipse中的新软件:Help-&gt;安装新软件:在第一行 &#34;与&#34;合作选择: &#34; Luna - FORBITTEN LINK for low REPUTATION-people&#34; (对于Eclipse Luna版本,将其修改为Eclipse版本!)。 等待,直到等待...完成然后选择(最后一个条目): &#34; Web,XML,Java EE和OSGI企业开发)

3。使用Selenium IDE通过创建&#34;测试用例&#34;来识别HTML-Code中的WebElement。并将它们作为Java代码导出到Eclipse:

详细教程:

!!! FUCK:我不允许发布链接因为我声誉不佳。只是想做一些好事,但受到了阻碍(他妈的这个世界!)!!!

ħ**号码://docs.seleniumhq.org/docs/02_selenium_ide.jsp

(注意:用t代替两个*)

3.1。打开FireFox-Browser:转到要检查/抓取/解析HTML代码的WebSite。然后(页面加载后)打开Selenium IDE(Tools-&gt; Selenium IDE)。确保红色按钮(在某些视频工具中看起来像记录按钮) 在menuBar中的最右边位置(在&#34;表/源&#34; -Tabs)是 激活(您可以通过MouseOver阅读消息)。录音时,各自 点击您要检查的网站会自动创建一个条目 进入&#34;表&#34; -tab(一种简单的脚本命令)。尝试执行 您可以/需要在您要抓取的网站上执行的许多操作 每个动作都为您提供HTML代码中的元素,并在以后帮助您 通过Java代码识别它!

3.2。完成你的检查后#34;通过简单的MouseClicks,你有 保存你的&#34;测试用例&#34;你现在创建了。 文件(F) - &gt;保存测试用例:选择您想要的名称并确认保存 - 过程

注意:测试用例的默认StoreLocation是&#34; Mozilla- FireFox&#34; - PC上的文件夹(常用路径:C:\ Programs \ Mozilla Firefox)。

3.3。将测试用例作为JAVA-CODE导出到Eclipse:

!!!!!这是Selenium IDE最棒的功能!!!!!

现在 - 保存测试用例后 - 再次在Selenium IDE中: 文件(F) - &gt;出口测试案例如下: 选择:Java / JUnit 4 / WebDriver:再次打开FileChooser(默认值: FireFox文件夹)现在你可以保存这个&#34; Export-File&#34;作为Java文件。 重要提示:文件结尾必须是&#34; .java&#34; (例如:&#34; IHateLowReputation.java&#34;)。 然后将其复制/导入Eclipse-Project。现在你可以打开它 .java-file并检查rigth WebElements的outwritten Java代码 你想找/选择/操纵。 您可以使用它来感受Selenium Webdriver如何命令 Java必须编码。将所需的代码行复制到您的班级。

_____________这是我上面问题的解决方案代码:

package fixWrongEntries;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.support.ui.Select;

import com.gargoylesoftware.htmlunit.ScriptResult;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSelect;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;

import data.DB_Steam_Spiele;
import data.Spiel;

public class SolveButtonClick_FormSubmitt
{
public static void main(String[] args)
{

    String agecheckButton = "Content in this product may not be appropriate for all ages, or may not be appropriate for viewing at work.";
    String agecheckKonkret = "Please enter your birth date to continue:";
    String noReviews = "There are no reviews for this product";
    try
    {
// turn off annoying htmlunit warnings
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
// Enabling JavaScript  => true in brackets
        HtmlUnitDriver driver = new HtmlUnitDriver(true);
// Link for agecheck Typ 1 (simply Button click)
        String url = "http://store.steampowered.com/app/324800/?snr=1_7_...";
// Link for agecheck Typ 2 (fill out formular and submitt)
//Stng url = "http://store.steampowered.com/agecheck/app/72850/";
        driver.get(url);
//              System.out.println(driver.findElement(By.cssSelector("h2")).getText());
        System.out.println(driver.getCurrentUrl());
            /*********************************************************************
         *
         * Agecheck Typ 2
         *
             *********************************************************************/
            if(driver.findElement(By.cssSelector("h2")).getText().equals(agecheckKonkret))
        {
            System.out.println("Achtung: Agecheck konkret!");
// Fill out form with age-specifications:
            new Select(driver.findElement(By.name("ageDay"))).selectByVisibleText("18");
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            new Select(driver.findElement(By.name("ageMonth"))).selectByVisibleText("April");
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            new Select(driver.findElement(By.id("ageYear"))).selectByVisibleText("1970");
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            // Click AgeCheck Formular Button: Fortfahren
                driver.findElement(By.cssSelector("a.btnv6_blue_hoverfade.btn_small > span")).click();
                if(driver.findElement(By.id("app_reviews_hash")).getText().contains(noReviews))
            {
                System.out.println("Keine Reviews vorhanden!");
                continue;
            }
            else     if(!driver.findElement(By.id("app_reviews_hash")).getText().contains(noReviews))
            {
                String all =     driver.findElement(By.xpath("//div[@id='app_reviews_hash']/div[3]/div[2]/label"))
                        .getText();
                String steamPurchaser = driver.findElement(By
                        .xpath("//div[@id='app_reviews_hash']/div[3]/div[2]/label[2]")).getText();

                String communityURL =     driver.findElement(By.cssSelector("a.btnv6_blue_hoverfade.btn_medium"))
                        .getAttribute("href");
            }
        }

            /*********************************************************************
         *
         * AgeChecck Type 1
         *
             *********************************************************************/
        else     if(driver.findElement(By.cssSelector("h2")).getText().equals(agecheckButton))
        {
            System.out.println("Achtung: Agecheck Button!");
                driver.findElement(By.cssSelector("a.btn_grey_white_innerfade.btn_medium > span")).click();
                if(driver.findElement(By.id("app_reviews_hash")).getText().contains(noReviews))
            {
                System.out.println("Keine Reviews vorhanden!");
                continue;
            }
            else     if(!driver.findElement(By.id("app_reviews_hash")).getText().contains(noReviews))
            {
                String all = driver.findElement(By.xpath("//div[@id='app_reviews_hash']/div[3]/div[2]/label"))
                        .getText();
                String steamPurchaser = driver.findElement(By
                        .xpath("//div[@id='app_reviews_hash']/div[3]/div[2]/label[2]")).getText();
                String communityURL =     driver.findElement(By.cssSelector("a.btnv6_blue_hoverfade.btn_medium"))
                        .getAttribute("href");
            }
        }
            /*********************************************************************
         *
         * No Agecheck
         *
             *********************************************************************/
        else
        {
                if(driver.findElement(By.id("app_reviews_hash")).getText().contains(noReviews))
            {
                System.out.println("Keine Reviews vorhanden!");
                continue;
            }
            else     if(!driver.findElement(By.id("app_reviews_hash")).getText().contains(noReviews))
            {
                String all =     driver.findElement(By.xpath("//div[@id='app_reviews_hash']/div[3]/div[2]/label"))
                        .getText();
                String steamPurchaser = driver.findElement(By
                        .xpath("//div[@id='app_reviews_hash']/div[3]/div[2]/label[2]")).getText();
                String communityURL =     driver.findElement(By.cssSelector("a.btnv6_blue_hoverfade.btn_medium"))
                        .getAttribute("href");
            }
        }

    }
    catch(Throwable t)
    {
        System.out.println("Fehlermeldung aufgefangen");
        t.printStackTrace();
    }
}

private static boolean isElementPresent(WebDriver driver, By by)
{
    try
    {
        driver.findElement(by);
        return true;
    }
    catch(NoSuchElementException e)
    {
        return false;
    }
}

}

我希望这可以帮助解决类似问题的人。

相关问题