0

私はchromedriverを使用してロボットのWebクライアントを作成しています。 特定のWebページでは、サービスでテストを実行しているかどうかによって結果が異なります。ChromeDriverが間違ったボタン位置を取得してクリックが失敗する

webdriver.SwitchTo().Frame(iframe); 

var element = webdriver.FindElement(By.Id("Button1")); 
element.Click(); 

インテグレーションサーバー(クルーズコントロール)でテストを実行すると、次のようなコードでiframe内のボタンをクリックしようとしています。

ボタンのLocationプロパティは930、-14です(Sizeは31,21)。

クリック数は、次のメッセージで失敗する:

Element is not clickable at point (945, -4)

Iは、デスクトップアプリケーションでテスト16621(幅と高さは以下のように報告されるように位置が正しく計算され

(リサイズ)を実行する場合85、20)。

ボタンをクリックできます。

問題

どうすればよいですか?私は何が起こるかを知るために近づく方法を模索しています。

+0

私は、質問を閉じるボタンを混在しています。 –

答えて

0

私はこの問題をクロームで何度も経験していましたが、私の回避策はjavascriptのscrollIntoViewを使って可視のビューポートをその要素に移動することです。

あなたが「要素は見えない」というエラーになるだろう、なぜ2つの理由があります。

  1. 要素が セレンが開いたブラウザウィンドウの可視範囲内にないが。 scrollIntoViewを使用して
  2. 要素はCSSによって隠されている(それは別の要素の下にある、またはそれをfalseに設定した表示のしている)

常には、それらの可能性のある問題の最初のをカバーします。ページビューの幅や高さにかかわらず、scrollIntoViewはIDで要素を探し、可視のブラウザ領域をその要素に移動します。本質的に、スクロールバーを物理的に画面上のその要素を見ることができるまでエミュレートします。

第二の問題はもちろん、スタイリングの問題ですが、あなたはまた、

がテストされていない生のJavaScript(その上に設定されたCSSプロパティなど)を備え、その要素を操作することができますが、これは動作するはずです:

WebDriver.executeScript(
    'var elm = document.getElementById("Button1");elm.scrollIntoView(true);' 
); 
// Continue to access element: WebDriver.By.Id("Button1").Click(); 
// You could also click the element through javascript: 
// Example: 
// var elm = document.getElementById("Button1");elm.scrollIntoView(true);elm.click(); 
// if doing the above make sure you remove the WebDriver.click()l line. 

これは、さまざまなプラットフォームでさまざまな画面サイズでクロムをテストする場合にも使用します。画面サイズに関係なく、scrollIntoViewを使用して要素とやりとりすると、常に一貫した結果が得られます。私は最高でセレンの薄片テストを見つけると、クロムは時にはそれが矛盾した結果を引き起こすので非常に迅速です。各インタラクションの前にこれを行うことは、おそらくセレンテストをより信頼性の高いものにするために私が作った最大の変更です。

のscrollIntoView上のいくつかの詳細情報:https://developer.mozilla.org/en/docs/Web/API/Element/scrollIntoView

+0

ボタンは完全に間違った位置にあります。ページ上にさらに下がっている場合、クロムドライブがボタンの位置を取得するのは難しいですか? –

+0

私は 'IJavaScriptExecutor'を使っていてもscrollIntoView行を追加しましたが、同じ方法でボタンの位置が報告されているので、クリックに失敗しています。 –

+0

ボタンが間違った位置にあるのはスタイリングの問題ですか、いいえ? chromedriver/seleniumの観点からは、位置が何であるかは関係ありません:scrollIntoViewは常に、要素IDによってそれがどこにでも移動します。後にクリックが失敗した場合は、生のjavascriptでもやってみてください:上記の答えをそのように変更します。 –

1

一般エラーメッセージ

Element is not clickable at point (x, y)

は、クリックを受け取ることになる他の要素などのテキスト何かで終わるし、それは要素のHTMLをログに記録するために行くことクリックを受け取ります。その要素をDOMで探します。多くの場合、ロードされていないダイナミックなHTMLや、完全に解読されないダイアログなどがあります。WebDriverWaitExpectedConditionsとして要素が非表示になるのを待ってみてください。

ページが移行中またはゆっくりと読み込まれている場合には、前のページにID = button1が表示されていないことを確認してください。新しいページで要素を探す前に、要素が古くなるのを待って(ページ遷移が確実に開始されるように)する必要があります。

+0

例外メッセージは、説明どおりに終了しません。ボタンはそこにあります。なぜなら、そのプロパティを使ってその場所とサイズを取得できないからです。前のページは「

+0

私は質問を閉じるボタンを混在させました。 –

関連する問題