Selenium Webdriver。 Internet Explorer 9中的鼠标操作不准确

时间:2012-02-15 16:24:32

标签: testing selenium mouse webdriver

向所有人致以问候!

我不是母语为英语的人,所以请原谅我公平的语法。

Selenium是一个用于在不同浏览器中测试Web应用程序的框架。我想问一下使用Selenium的人提供任何帮助。我问Selenium的谷歌集团的人,但没人帮助我。

我正在使用Selenium Webdriver进行大量鼠标交互的项目。我正在编写C#测试。当我的团队开始使用Selenium Webdriver时,我们注意到,鼠标操作(OpenQA.Selenium.Interactions.Actions)在IE中有一些意想不到的行为,并且在不同的浏览器(甚至在不同的机器上)上工作方式不同。我是第一次使用鼠标操作的唯一测试人员。我指责Selenium Webdriver,我试图找到避免这种不准确的方法。我正在调查这个问题很长一段时间,但没有任何结果。但我不想把时间花在史前史上。

好的,让我来描述一下情况。我们创建了演示项目:简单的页面。我们通过按住鼠标左键实现了在画布上绘画的可能性。所以我希望你很清楚。

下一个重要的是我们启用了日志记录到控制台。也就是说,我们可以通过打开控制台来查看画布内鼠标箭头的坐标。

然后我们写了一个测试:

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)!但是他们在一个月前就有了不准确的原因(这就是为什么我们认为鼠标操作不准确)。我仍然有不准确的结果:(192,96)。因此每100px偏移量有4px错误。我的同事们不明白,他们已经改变了什么以及为什么鼠标行动现在或者他们正常工作。

另一个有趣的事情是视觉上(我提醒你,我们可以在画布上绘画)它绝对是100px(我们在垂直移动鼠标箭头时按住鼠标按钮)!惊人!

所以,这就是实验。

我请任何合适的人帮我解决这个问题。它只出现在IE9中。我想了解这种行为的原因。如何实现Actions类?它可以取决于鼠标驱动程序或类似的东西?在这种情况下,如果它的问题,我使用无线鼠标,它有一个特殊的驱动程序。拜托,帮助我!

P.S。我试图更改鼠标设置,屏幕设置,但没有结果。

谢谢!

祝你好运, Michael Kalygin。

2 个答案:

答案 0 :(得分:4)

确保IE9中的缩放级别设置为100% - 这是我能想到的唯一可以将坐标偏移4%的内容。

答案 1 :(得分:0)

我稍微修改了一系列动作以满足我的需要。它适用于IE8,但Firefox和Chrome不喜欢它。我试图通过一些偏移量(100,100)拖放一个元素,但是FireFox会抛出一个异常,说目标超出界限并给出一些与我正在做的不匹配的疯狂坐标数。 Chrome只是不移动元素。

我的问题是该图是第三方窗口小部件,它使用svg进行chrome和Firefox。在IE中我可以使用常用技术在图表上找到“单元格”,但Firefox和Chrome不允许我通过Id,Class或任何东西找到元素(单元格)。所以我有一个javascriptExecutor,我可以使用它来获取所有图形单元格数据,包括图形小部件上单元格的x,y位置。我可以得到图形小部件的位置,因为图形有一个“包装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

好的,我发现了我的问题。我需要获取图元素的大小并将高度和宽度除以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