如何在没有名称,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");
但没有任何效果。
提前感谢您的帮助!
答案 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插件)。
________精心描述(一步一步):
转到:
!!! 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)。
得到:
!!! 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企业开发)
详细教程:
!!! 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;
}
}
}
我希望这可以帮助解决类似问题的人。