27

これが私がすることです:

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

リンク「mylink」は存在し、click() の最初の呼び出しは常に機能します。しかし、2 番目の click() は機能しているように見えることもあれば、そうでないこともあります。

ページの読み込みが開始されていないため、click() イベントがまったくトリガーされていないようです。残念ながら、この動作は過小評価的です。

これが私がすでに試したことです:

  1. より長い時間のタイムアウトを設定
    => 役に立たなかった

  2. 1つのページをロードした後に要素が存在するのを待つ
    =>ページのロードが開始されないため、どちらも機能しません

今のところ、最終的に click() を 2 回呼び出すことになったので、次のようにします。

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)

selenium.click("link=mylink");
selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

それはうまくいきますが、それは本当に良い解決策ではありません。私は別のフォーラムで、誰かが「clickAndWaitWithRetry」のようなものを書くことを提案したことも見ました:

  try {
      super.click("link=mylink");
      super.waitForPageToLoad(60000);
  }
  catch (SeleniumException e) {
      super.click("link=mylink");
      super.waitForPageToLoad(60000);
  }

しかし、それも適切な解決策ではないと思います.... click() イベントが時々トリガーされない理由はありますか?

4

14 に答える 14

10

一見ランダムに見えることがありますが、Selenium は特定のアンカー タグをクリックするのを好まないことがあります。何が原因かはわかりませんが、発生します。そのような場合、代わりに面倒なリンクがあることがわかります

selenium.click(...)

行う

selenium.fireEvent( locator, 'click' );

他の人が私の上で述べたように、私は特に次のように表示されるアンカータグに問題がありました:

<a href="javascript:...." >
于 2009-07-29T18:19:33.977 に答える
4

私はしばらくセレンをやっていましたが、本当にwaitForPageToLoad()が嫌いになりました。問題の要素が存在するのを常に待っていると考えるかもしれません。

この方法は、私がこのように遭遇するほとんどの奇妙な問題を解決するように見えることがわかりました. もう 1 つの可能性は、JavaScript が原因で、リンクが最初にクリックされたときに何も実行されない可能性があることです。可能性は低いようですが、再確認する価値があります。

于 2009-03-15T18:14:38.093 に答える
3

WebDriver (Selenium 2.0) を試したところ、WebElement#sendKeys(Keys.ENTER) が機能することがわかりました。

于 2010-01-26T18:01:29.050 に答える
3

Selenium の click() イベントが常にトリガーされるわけではないようです => タイムアウトが発生しますか?

Selenium.click コマンドの前に selenium.pause を試してください。上記のすべてを試しましたが、どれも問題を解決していないようです。最後に、問題を解決する Magic selenium.pause を取得しました..

これがあなたの問題も解決することを願っています

于 2011-06-06T11:38:39.910 に答える
2

私も今この問題に直面しています。これの私の使用法から、次が最も一貫しているようです:

@browser.click(selector, {:wait_for => :page})

なぜそうなるのか正確にはわかりません。しかし、あなたがそうするならば、それはそうです:

@browser.click(selector)
   [maybe some stuff here too]
@browser.wait_for(:wait_for => :page)

そうすると、すでにロードされているページを待つことになります(つまり、永遠に待つことになります)。

私はSeleniumのソースコードを掘り下げて、このナゲットを見つけました:

  def click(locator, options={})
    remote_control_command "click", [locator,]
    wait_for options
  end

..。

  # Waits for a new page to load.
  #
  # Selenium constantly keeps track of new pages loading, and sets a
  # "newPageLoaded" flag when it first notices a page load. Running
  # any other Selenium command after turns the flag to false. Hence,
  # if you want to wait for a page to load, you must wait immediately
  # after a Selenium command that caused a page-load.
  #
  # * 'timeout_in_seconds' is a timeout in seconds, after which this
  #   command will return with an error
  def wait_for_page(timeout_in_seconds=nil)
    remote_control_command "waitForPageToLoad",
        [actual_timeout_in_milliseconds(timeout_in_seconds),]
  end
  alias_method :wait_for_page_to_load, :wait_for_page

基本的に、これは次のことを行っています。

@browser.click(selector)
@browser.wait_for(:wait_for => :page)

ただし、コメントにあるように、最初に必要なのは、直後に:wait_forコマンドを使用することです。

そしてもちろん...順序を切り替えると、同じ待機状態になります。

@browser.wait_for(:wait_for => :page)
@browser.click(selector)

Seleniumの詳細をすべて知らなくても、クリックでオプションとして渡された場合、Seleniumは:wait_forトリガーを登録する必要があるようです。そうしないと、:wait_forが呼び出される直前にSeleniumに待機するように指示すると、永遠に待機することになります。

于 2011-03-03T00:28:41.057 に答える
2

ここでこれが機能します:

selenium.waitForPageToLoad("60000");

selenium.click("link= my link");
于 2010-11-16T11:32:56.420 に答える
2

Selenium 1.0.12 と Firefox 5.0 でも同じ問題がありました。自動テストを次のように機能させることができました。

  • すべての「AndWait」コマンドを削除しました(テスト/ブラウザがハングすることがあります)
  • クリックの前に一時停止を追加しました
  • クリック後にwaitForVisibleを追加しました(通常、次のページで操作したい次のhtmlコントロールを待ちます)。

こんなふうになります:

  • waitForVisible OK
  • 一時停止 1000
  • [OK] をクリックします
  • waitForVisible link=Go
  • 一時停止 1000
  • [移動] をクリックします

等...

「waitForVisible」がトリガーされるのが早すぎるようです。つまり、イベント ハンドラーがコントロールにプラグインされる前です (したがって、コントロールをクリックしても効果がありません)。1 秒待てば、クリック ハンドラをプラグイン/アクティブ化するだけで十分です...

于 2011-06-30T12:26:38.680 に答える
1

正しい場所でタイムアウトを増やしていることを確認してください。投稿した行は次のとおりです。

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

この待機は、クリック後に戻ってくるページがロードされるのを待ちます。しかし、あなたが説明する問題は、クリックしようとすると失敗するということです。したがって、この前に待機を増やすようにしてください。

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)
// after the last click in these steps:
selenium.waitForPageToLoad(60000);
// anything else that happened after that

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);
于 2009-03-14T20:38:47.723 に答える
1

クリックしたときにページが正しく読み込まれませんでした。ページ上のさまざまな要素をチェックして、ページが読み込まれたことを確認します。

また、リンクが表示されて表示されるまで待ってから、クリックしてください。

于 2009-03-14T18:39:05.377 に答える
1

FireFox を使用している場合は、3.6 以降を使用していることを確認してください。WaitForPageToLoad は JavaScript 変数 'readyState' を使用しますが、Firefox は 3.6 でのみこれをサポートしました。以前のバージョンは待たない

( を参照org.openqa.selenium.internal.seleniumemulation.WaitForPageToLoad)

于 2011-03-29T05:59:13.890 に答える
0

私は同じ問題を抱えています:(セレンIDE 1.0.10、phpunit 3.5、セレンRCサーバー1.0.3で

 EDITED: 
 The culprit seems to be browser FF 3.6.13 , after upgrade to FF 3.6.14
  all my errors are  gone . My tests are working like charm :). 

 Selenium IDE 1.0.10
 PHPUnit: 3.5.6
 Selenium Server:selenium-2.0b1 (selenium-2.0b2 is buggy)
于 2011-02-25T16:31:21.390 に答える
0
selenium.click("link=Continue to this website (not recommended).");
Thread.sleep(5000);
于 2010-07-20T11:02:19.150 に答える
0

これを試して:

selenium.fireEvent(ID, "keypress");
于 2010-04-21T14:03:44.580 に答える
0

私は同じ問題を抱えていて、最初にリンクのテキストを取得する必要があることがわかりました。これが理想的な方法ではないことは承知していますが、リンクに固有の名前が付けられていることは幸運です。

C# コード:

var text = Selenium.GetText(myLocator);
Selenium.Click("link=" + text);
于 2011-02-01T18:23:18.720 に答える