ChromeDriver获取错误的按钮位置,因此点击它会失败

时间:2016-12-12 14:48:01

标签: selenium selenium-webdriver selenium-chromedriver telerik-radbutton

我正在用chromedriver编写一个机器人Web客户端。 在某个网页中,我会得到不同的结果,具体取决于我是否在服务中运行测试。我试图点击iframe中的按钮,代码如下:

webdriver.SwitchTo().Frame(iframe);

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

如果我在集成服务器(巡航控制)上运行测试。

按钮位置属性为930,-14(尺寸为31,21)。

点击失败,显示以下消息:

  

元素在点(945,-4)

时无法点击

如果我在桌面应用程序(winforms)中运行测试

位置正确计算为16,621(宽度和高度报告为85,20)。

可以点击该按钮。

问题

我该如何处理?我寻求一种方法来接近发现会发生什么。

2 个答案:

答案 0 :(得分:1)

通常是错误消息

  

元素在点(x,y)

时无法点击

以文本结束,类似于另一个元素将接收到点击,然后它继续记录将接收点击的元素的HTML。在DOM中找到该元素。很多时候,它是一些未完成加载的动态HTML,可能是一个未被完全解除的对话框等。尝试使用WebDriverWait使用ExpectedConditions等待元素不可见。

另外,如果页面正在转换或加载缓慢,请确保上一页中没有id = button1可能被拾取。在新页面上查找之前,您可能需要等待元素过时(以确保页面转换已开始)。

答案 1 :(得分:0)

我曾经多次在chrome中遇到过这个问题,而我的解决方法是使用javascript的scrollIntoView将可见视口移动到该元素。

有两个原因会导致“元素不可见”错误:

  1. 该元素不在浏览器窗口的可见范围内 硒已经开了;
  2. 该元素通过CSS隐藏(它位于另一个元素下,或者将其可见性设置为false)
  3. 使用scrollIntoView将始终覆盖第一个可能出现的问题。无论您的页面视图有多宽或多高,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.
    

    使用此功能还将涵盖您在具有可变屏幕尺寸的不同平台上测试chrome的情况。无论屏幕大小如何,在与元素交互之前使用scrollIntoView将始终提供一致的结果。我发现硒测试最好是片状,有时铬很快就会导致不一致的结果。在每次互动之前这样做可能是我为使硒测试更可靠而做出的最大改变。

    有关scrollIntoView的更多信息:https://developer.mozilla.org/en/docs/Web/API/Element/scrollIntoView