web-dev-qa-db-ja.com

セレンのclick()イベントが常にトリガーされないようです=>結果はタイムアウトになりますか?

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

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()イベントがときどきトリガーされない理由/説明はありますか?

26
blackicecube

時々、ランダムに見えるかもしれませんが、Seleniumは特定のアンカータグをクリックしたくないだけです。何が原因かはわかりませんが、起こります。それらの場合、代わりに問題のあるリンクを見つける

Selenium.click(...)

行う

Selenium.fireEvent( locator, 'click' );

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

<a href="javascript:...." >
10
Andrew Martinez

私はしばらくの間Seleniumを使用しており、waitForPageToLoad()の嫌いなものを開発しました。問題の要素が存在するのを常に待つことを常に検討するかもしれません。

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

4
Eric Wendelin

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

3
Firefight

セレンのclick()イベントが常にトリガーされないようです=>結果はタイムアウトになりますか?

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

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

3
Sandeep Kumar

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

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

こんなふうになります:

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

等...

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

2
Edot

ここでこれは動作します:

Selenium.waitForPageToLoad("60000");

Selenium.click("link= my link");
2
Vinesh

私もこの問題に遭遇しています。これの私の使用法から、以下が最も一貫しているようです:

@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がclickでオプションとして渡されたときに:wait_forトリガーを登録する必要があるようです。そうしないと、:wait_forが呼び出される前にSeleniumにその瞬間を待機するように指示した場合、永久に待機してしまう可能性があります。

2
mdgreenfield

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

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);
1
eglasius

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

また、クリックする前に、リンクが表示されて表示されるのを待ちます。

1
Vijay Kotari

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

(見る org.openqa.Selenium.internal.seleniumemulation.WaitForPageToLoad

1
racraman

私は同じ問題を抱えています:( with Selenium IDE 1.0.10、phpunit 3.5、Selenium RC server 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)
0
sakhunzai

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

C#コード:

var text = Selenium.GetText(myLocator);
Selenium.Click("link=" + text);
0
Jesse Sanders
Selenium.click("link=Continue to this website (not recommended).");
Thread.sleep(5000);
0
Mayank

これを試して:

Selenium.fireEvent(ID, "keypress");
0
Amine