これが私がすることです:
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つのページをロードした後、要素が存在するのを待ちます
=>も、ページの読み込みが開始されないため、機能しません
今のところ、私は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()イベントがときどきトリガーされない理由/説明はありますか?
時々、ランダムに見えるかもしれませんが、Seleniumは特定のアンカータグをクリックしたくないだけです。何が原因かはわかりませんが、起こります。それらの場合、代わりに問題のあるリンクを見つける
Selenium.click(...)
行う
Selenium.fireEvent( locator, 'click' );
他の人が私の上で述べたように、私は特に次のように表示されるアンカータグに問題がありました:
<a href="javascript:...." >
私はしばらくの間Seleniumを使用しており、waitForPageToLoad()の嫌いなものを開発しました。問題の要素が存在するのを常に待つことを常に検討するかもしれません。
この方法は、私がこのように遭遇するほとんどの奇妙な問題を解決するように見えることがわかりました。他の可能性としては、最初にクリックしたときにリンクが何もしないようにするJavaScriptがある可能性があります。可能性は低いですが、再確認する価値があります。
WebDriver(Selenium 2.0)を試したところ、WebElement#sendKeys(Keys.ENTER)が機能することがわかりました。
セレンのclick()イベントが常にトリガーされないようです=>結果はタイムアウトになりますか?
Selenium.clickコマンドの前にSelenium.pauseを試してください。上記をすべて試しましたが、どれも私たちの問題を解決していないようです。最後に、Magic Selenium.pauseを取得して、問題を解決しました。
これがあなたの問題も解決することを願っています
Selenium 1.0.12とFirefox 5.0でも同じ問題がありました。自動テストをこのように機能させることができました。
こんなふうになります:
等...
「waitForVisible」のトリガーが早すぎるようです。つまり、イベントハンドラーがコントロールにプラグインされる前です(したがって、コントロールをクリックしても効果はありません)。 1秒待つ場合は、クリックハンドラーを接続/アクティブ化するだけで十分です...
ここでこれは動作します:
Selenium.waitForPageToLoad("60000");
Selenium.click("link= my link");
私もこの問題に遭遇しています。これの私の使用法から、以下が最も一貫しているようです:
@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にその瞬間を待機するように指示した場合、永久に待機してしまう可能性があります。
正しい場所でタイムアウトを増やしていることを確認してください。あなたが投稿した行は次のとおりです。
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);
クリックしたときにページが正しく読み込まれていません。ページのさまざまな要素をチェックして、ページが読み込まれたことを確認します。
また、クリックする前に、リンクが表示されて表示されるのを待ちます。
FireFoxを使用している場合は、3.6以降を使用していることを確認してください。 WaitForPageToLoadはjavascript変数「readyState」を使用しますが、Firefoxはこれを3.6でのみサポートしました。以前のバージョンは待たない
(見る org.openqa.Selenium.internal.seleniumemulation.WaitForPageToLoad
)
私は同じ問題を抱えています:( 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)
私は同じ問題を抱えていて、最初にリンクのテキストを取得する必要があることがわかりました。それが理想的な方法ではないことはわかっていますが、リンクに一意の名前が付けられているのは幸いです。
C#コード:
var text = Selenium.GetText(myLocator);
Selenium.Click("link=" + text);
Selenium.click("link=Continue to this website (not recommended).");
Thread.sleep(5000);
これを試して:
Selenium.fireEvent(ID, "keypress");