13

私がする必要があるのは、Web ページを参照してログインし、そのサイトでログインが必要な別の Web ページを参照することです。そのため、Cookie を保存する必要があります。その後、そのページの要素をクリックしてフォームに入力し、Web ページから返されたメッセージを受け取る必要があります。リンクに直接移動すると仮定して、実際にページに移動してボタンをクリックする必要がある理由は、ログインしてリンクをクリックするたびにセッション ID が割り当てられ、常に異なるためです。ボタンは次のようになります。通常の href リンクではありません。

<span id=":tv" idlink="" class="sA" tabindex="0" role="link">Next</span>

とにかく、これを行う最も簡単な方法は何ですか?ありがとう。

更新: HTMLunit やその他のヘッドレス ブラウザー ライブラリを試してみたところ、「ヘッドレス」を使用しているようには見えません。このページについて私が最近知ったもう 1 つのことは、すべての HTML が何らかの奇妙な形式になっていることです... すべてが script タグ内にあるということです。これがサンプルです。

"?ui\x3d2\x26view\x3dss\x26mset\x3dmain\x26ver\x3d-68igm85d1771\x26am\x3d!Zsl-0RZ-XLv0BO3aNKsL0sgMg3nH10t5WrPgJSU8CYS-KNWlyrLmiW3HvC5ykER_n_5dDw\x26fri"],"http://example.com/?ctx\x3d%67mail\x26hl\x3den",,0,"Gmail","Gmail",[["us","c130f0854ca2c2bb",[["n"],["m","New features!"],["u"],["k","0"],["p","1000:500000,10,200000,5,100000,3,75000,2,0,1"],["h","https://survey.googleratings.com/wix/p1679258.aspx?l\x3d1033"],["at","query,5,contacts,5,adv,5,cf,5,default,20"],["v","https://www.youtube.com/embed/Ra8HG6MkOXY?showinfo\x3d0"],

ボタンの要素を検査すると、上で投稿したボタンの HTML コードが表示されますが、ソースを表示すると表示されません。基本的に、私がする必要があるのは、ある種の GUI を使用して、ユーザーにリンクに移動させ、プログラムに情報を入力させることです。誰も私がこれを行う方法を知っていますか? ありがとう。

4

6 に答える 6

5

Selenium の 5 分間の入門ガイドをご覧ください: http://code.google.com/p/selenium/wiki/GettingStarted

于 2013-02-09T05:09:47.623 に答える
2

ログイン ページで、フォームの HTML を見て、投稿先の URL と URL パラメータを確認します。次に、正しい情報が入力された同じパラメーターを使用してその URL を要求し、すべての Cookie ヘッダーを保存して 2​​ 番目のページに送信するようにしてください。次に、html パーサーを使用してリンクを見つけます。sourceforge にはいくつかの html パーサーが用意されており、java に組み込まれている xml パーサーを試すこともできますが、サイトにわずかな html の間違いがあった場合でもエラーが発生します。

EDITは、それが通常のリンクではないことに気づきませんでした。その場合、サイトの JavaScript を見て、リンク先を確認する必要があります。リンクの実行に JavaScript が必要な場合は、さらに複雑になります。Java はブラウザの JavaScript を実行できませんが、jframes に追加できる Web ブラウザ クラスを含む DJ ネイティブ スウィングというライブラリを見つけました。ネイティブ ブラウザを使用してレンダリングし、javascript を実行します。

于 2013-02-06T23:36:05.783 に答える
1

他の人が指摘したように、これはSeleniumで可能になるはずです。

私は Selenium を使用してログインし、サイトをクロールして、サイト上のすべてのフォーム (30 以上のフォーム) の値の順列をすべて発見しました。これらの値は、後でフォームに特定の値を入力して送信するために使用されます。このサイトは非常に JS/jQuery に重きを置いていたので、Selenium の組み込みの JavaScript エグゼキューター、css セレクター、および XPath を使用してこれを実現しました。

より高速な代替手段として HtmlUnit と HttpUnit を実装しましたが、クロールしているサイトの JS セマンティクスを考えると、Selenium ほど信頼性が高くないことがわかりました。

Selenium の実装はかなりページ固有であり、ボタン スクリプト ジャンクで何が起こっているのかを理解するためにコーディングしているページを確認することはできないため、それを達成する方法についてコードを提供することは困難です。ただし、関連する可能性のあるセレン コード (Java) のスニペットをいくつか含めました。

Element element = driver.findElements(By.id(value)); //find element on page
List<Element> buttons = parent.findElements(By.xpath("./tr/td/button")); //find child element
button.click();
element.submit() //submit enclosing form
element.sendKeys(text); //enter text in an input
String elementText = (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].innerText || arguments[0].textContent", element); //interact with a selenium element via JS

異なるページで同様の機能をコーディングしている場合は、インターフェイスの背後にあるPageObjectsが役立ちます。

Anew が投稿したリンクは良い出発点であり、古き良き StackOverflow には、これまでのほぼすべての Selenium の問題に対する回答があります。

于 2013-02-16T00:15:41.643 に答える
0

私はいつでもhtmlunitをお勧めします。素晴らしい図書館です。

まず、彼らの Web ページ ( http://htmlunit.sourceforge.net/ ) をチェックして、htmlunit を起動して実行します。必ず最新のスナップショット (これを書いているときは 2.12) を使用してください。

次の設定を試して、ほとんどすべての障害を無視します。

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);
webClient.getOptions().setRedirectEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);

次に、ページを取得するときは、ログイン フォームを投稿するなど、ページで何かを行う前に、バックグラウンド Javascript を待機するようにしてください。

//Get Page
HtmlPage page1 = webClient.getPage("https://login-url/");

//Wait for background Javascript
webClient.waitForBackgroundJavaScript(10000);

//Get first form on page
HtmlForm form = page1.getForms().get(0);

//Get login input fields using input field name
HtmlTextInput userName = form.getInputByName("UserName");
HtmlPasswordInput password = form.getInputByName("Password");

//Set input values
userName.setValueAttribute("MyUserName"); 
password.setValueAttribute("MyPassword"); 

//Find the first button in form using name, id or xpath
HtmlElement button = (HtmlElement) form.getFirstByXPath("//button");

//Post by clicking the button and cast the result, login arrival url, to a new page and repeat what you did with page1 or something else :) 
HtmlPage page2 = (HtmlPage) button.click(); 

//Profit
System.out.println(page2.asXml());    

この基本的な例がお役に立てば幸いです。

于 2013-02-15T23:28:33.017 に答える
0

プログラムでブラウジングする代わりに、ログイン リクエストを実行して Cookie を保存し、次のリクエストでそれらをフォーム ポストに設定してみてください。

于 2013-02-09T07:10:31.950 に答える
0

HTMLUnit は JavaScript の処理がかなり苦手で、Rhino JS ライブラリーはしばしばエラーを生成します (実際、エラーがないことは例外です)。Seleniumを使用することをお勧めします。これは基本的に、ヘッドレス ブラウザー (クロム、Firefox ベース) を制御するためのフレームワークです。

あなたの質問については、次のコードが機能します

selenium.open(myurl);
selenium.click("id=:tv");

次に、ページが読み込まれるまで待つ必要があります

selenium.waitForPageToLoad(someTime);
于 2013-02-15T07:41:33.370 に答える