Selenium Webdriver。在Internet Explorer 9中,鼠标动作不准确

4

大家好!

由于我的英语语法不够好,所以请多多包涵。Selenium是一个用于在不同浏览器中测试Web应用程序的框架。我想向正在使用Selenium的人寻求帮助。我在Selenium的Google Group中询问过其他用户,但没有人回答我。

我正在使用Selenium Webdriver进行大量鼠标交互的项目中编写C#测试。当我们的团队开始使用Selenium Webdriver时,我们发现鼠标操作(OpenQA.Selenium.Interactions.Actions)在IE中具有一些意外的行为,并且在不同的浏览器上(甚至在不同的机器上)表现也不同。起初,我是唯一使用鼠标操作的测试者。我一直责怪Selenium Webdriver,并试图找到避免这种不准确性的方法。我花了很长时间研究这个问题,但没有任何结果。但我不想浪费您的时间讲述这段前史。

好的,让我来描述一下情况。我们创建了演示项目:简单的页面和canvas。我们实现了通过按住左键在画布上绘制的功能。所以我希望这对您来说非常清楚。

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

然后我们编写了一个测试:

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)。所以每 100 像素的偏移产生了 4 像素的误差。我的同事不明白他们改变了什么,以及为什么鼠标操作现在对他们起作用了。
还有一件有趣的事情是,从视觉上看(我提醒您,我们可以在画布上进行绘制),它绝对是 100 像素(我们在垂直移动鼠标箭头时按住了鼠标按钮)!太神奇了!
因此,这就是实验。我请求任何相关人士帮助我解决这个问题。它只出现在 IE9 中。我想了解这种行为的原因。Actions 类是如何实现的?它可能取决于鼠标驱动程序之类的东西吗?如果是这样,如果有关系的话,我使用的是无线鼠标,它有一个特殊的驱动程序。请帮忙!
附言:我试图更改我的鼠标设置、屏幕设置,但没有任何结果。
谢谢!
最好的问候, Michael Kalygin。
2个回答

4

请确保IE9浏览器的缩放级别设置为100% - 我能想到唯一会使您的坐标偏移4%的原因就是这个。


哦,我的天啊!这太不可思议了,但看起来这就是原因。我已经重新安装IE好几次了...我一直在查看设置,却没有注意到它...可能是IE默认将其设置为105%!如果您在计算机上遇到相同的问题,请注意!非常感谢!你真棒! :)附言:太愚蠢了...真的...我很抱歉!所有的错误都是愚蠢的! :) - Michael Kalygin
它仍将在IE9中工作,即在较低的缩放级别下。您必须实现以下代码:/n <code>var service = InternetExplorerDriverService.CreateDefaultService(@"C:\SeleniumDrivers"); var options = new InternetExplorerOptions { IgnoreZoomLevel = true };</code> - rp4361

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,对于负偏移值取反。然后,我的第一个移动是到图形元素的位置(元素中心),然后移动到负偏移值以获取左上角,然后按偏移量移动到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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接