2012-02-15 14 views
4

おはようございます!Selenium Webdriver。 Internet Explorer 9でマウス操作が不正確になる

私はネイティブの英語のスピーカーではないので、私の公正な文法のために私を許してください。

セレンは、さまざまなブラウザのWebアプリケーションをテストするためのフレームワークです。 Seleniumを使っている人に助けを求める。私はSeleniumのGoogleグループのメンバーに質問していましたが、誰も私を助けませんでした。

私は、Selenium Webdriverを使用して多くのマウス操作を行うプロジェクトに取り組んでいます。私はC#でテストを書いています。私のチームがSelenium Webdriverを使い始めると、そのマウスアクション(OpenQA.Selenium.Interactions.Actions)はIEで予期せぬ動作をし、さまざまなブラウザ(および異なるマシンでさえ)で動作が異なることに気付きました。初めて私はマウスの操作に取り組んでいた唯一のテスターでした。私はSelenium Webdriverを非難していました。私はこの不正確さを避ける方法を見つけようとしていました。私は長い間この問題を調査していましたが、何の結果もありませんでした。しかし、私は先史時代にあなたの時間を過ごしたくありません。

[OK]を、状況を説明します。私たちはデモプロジェクトを作成しました。そして、マウスの左ボタンを押しながらこのキャンバスにペイントする可能性を実装しました。だから私はそれがあなたにとってかなり明確であることを願っています。

次に重要なのは、コンソールへのログを有効にしたことです。つまり、コンソールを開いてキャンバス内でマウスの矢印の座標を見ることができます。

はその後、我々はテストを書いた:

Actions a = new Actions(driver); 
a.Build(); 
a.MoveToElement(canvas, 100, 100) 
.ClickAndHold() 
.MoveByOffset(100, 0) 
.Release(); 
a.Perform(); 

コードは非常に簡単です。キャンバスにマウスの矢印を移動し、マウスの矢印を(100,100)だけオフセットしてから、垂直方向に100(マウスの左ボタンを押したまま)移動します。理解できるように、ログの結果は(200,100)にする必要があります。

しかし、ここで最も興味深いものがあります:私の同僚は同じ結果(200,100)を持っています!しかし、彼らは1ヶ月前に不正確でした(私たちがマウスの動きが不正確だと思った理由です)。そして私はまだ不正確な結果を残しています:(192、96)。オフセットの100pxあたり4pxのエラーがあります。私の同僚は、彼らが何を変えたのか、なぜマウスの行動が今、正しく動作しているのかを理解していません。

もう一つ興味深いのは視覚的に(私はキャンバスにペイントすることができます)、それは絶対に100pxです(マウスの矢印を垂直に動かすとマウスボタンが押されます)!素晴らしい!

これは実験です。

私はこの問題を解決するのに適切な人に頼んでいます。これはIE9でのみ表示されます。そして私はその行動の理由を理解したい。アクションクラスはどのように実装されていますか?それはマウスのドライバやそのようなものに依存することができますか?この場合、問題があれば、ワイヤレスマウスを使用していて、それに特別なドライバがあります。私を助けてください!

P.S.マウスの設定、画面の設定を変更しようとしましたが、結果は表示されませんでした。

ありがとうございました!

よろしくお願いいたします。 Michael Kalygin

答えて

4

IE9のズームレベルが100%に設定されていることを確認してください。これは、座標を4%だけオフセットすることができます。

+0

なんてこった!これは信じられないほどですが、これが理由です。私は何度かIEを再インストールしていました...私は設定を見ていて気付かなかった... おそらく、IEはデフォルトで105%に設定します!お使いのコンピュータで同じ問題が発生した場合は注意してください。 大きな感謝!あなたは素晴らしいです! :) P.S.:そんなに馬鹿...本当に...すみません!すべてのバグは常に愚かです! :) –

+0

"バグは常に愚かです" - 私の人生の物語::) – Anders

+0

IE9では、ズームレベルを下げても機能します。以下のコードを実装する必要があります:/ n var service = InternetExplorerDriverService.CreateDefaultService(@"C:\SeleniumDrivers"); var options = new InternetExplorerOptions { IgnoreZoomLevel = true }; Rishabh

0

私のニーズに合わせてアクションシーケンスを少し変更しました。それはIE8のためにはうまくいくが、FirefoxとChromeはそれを気に入らない。私はいくつかのオフセット(100,100)で要素をドラッグアンドドロップしようとしていますが、FireFoxは例外がスローされ、ターゲットが範囲外であり、私がやっているものと一致しないいくつかの狂った座標値を与えています。 Chromeは要素を移動しません。

私の問題は、グラフがchromeとFirefox用にsvgを使用する第三者ウィジェットだということです。 IEでは、グラフ上で「セル」を見つけるための一般的な手法を使用できますが、FirefoxとChromeではId、Classなどの要素(セル)を見つけることができません。だから私はグラフウィジェット上のセルのx、yの位置を含むすべてのグラフのセルデータを取得するために使用できるjavascriptExecutorを持っています。グラフの「ラッパーdiv」があるので、グラフウィジェットの位置を取得できます。グラフの位置を使用して、私は次のようにします:

Point mxPoint = driver.GetElementPosition(GraphicalDisplayPage.GraphDisplayPaneById); 
Actions moveCell = new Actions(driver); 

moveCell.Build(); 
moveCell.MoveByOffset(mxPoint.X, mxPoint.Y);//move mouse to upper left corner of graph 
moveCell.MoveByOffset(xOfCelltoMove, yOfCellToMove);//move mouse to cell we want to move 
moveCell.ClickAndHold();//select cell and hold it 
moveCell.MoveByOffset(100, 100);//drag cell 
moveCell.Release();//drop it 
moveCell.Perform();//run this set of actions 

私は私の問題を理解しました。グラフ要素のサイズを取得し、HeightとWidthを2で除算し、負のオフセットに対してこれらの値を無効にする必要があります。次に、最初のMoveはグラフ要素の位置(要素の中心)に移動し、次にネゲートされたオフセットに移動して左上隅に移動し、xOfCelltomoveとyOfcelltomoveにオフセット移動します。私は行きたい。私はまた、より一貫性のあるアクションは次のようになりので、作る要素の左の隅に対要素の上にマウスを得るためにxOfCellToMoveとyOfCellToMoveの両方に10を追加しました:

Size mxSize = driver.GetElementSize(GraphicalDisplayPage.JGraphDisplayPaneById); 
mxSize.Height = -(mxSize.Height/2); 
mxSize.Width = -(mxSize.Width/2); 

//create the action and do it 
Actions moveCell = new Actions(driver); 

moveCell.Build(); 
moveCell.MoveToElement(driver.FindElement(GraphicalDisplayPage.JGraphDisplayPaneById)) //mxPoint.X, mxPoint.Y) //move mouse to center of graph 

.MoveByOffset(mxSize.Width, mxSize.Height)//move mouse to top left corner of graph      
.MoveByOffset(xOfCelltoMove , yOfCellToMove) //move mouse to cell we want  
.ClickAndHold() //select cell and hold it 
.MoveByOffset(100, 100) //drag cell 
.Release();//drop it 

moveCell.Perform();//run this set of actions 
関連する問題