【问题标题】:Finding a center of a WebElement查找 WebElement 的中心
【发布时间】:2021-10-13 20:33:10
【问题描述】:

使用 appium 和 selenium 自动测试和 android 应用程序。 要按下我们使用WebElement.click() 功能的各种按钮,但在某些情况下这相当慢,所以用WebDriver.tap(coordinates) 替换它我需要点击按钮的中心,所以我编写了一个简单的函数来确定该中心在哪里:

        x_start = element.rect.get(X)
        y_start = element.rect.get(Y)
        width = element.rect.get("width")
        height = element.rect.get("height")

        x_result = x_start + width / 2
        y_result = y_start + height / 2

        self.driver.tap([(x_result, y_result)])

在我遇到屏幕底部的一些按钮不会返回左边缘之前就像一个魅力一样工作,但我最终得到了这个:

selenium.common.exceptions.InvalidArgumentException: Message: Coordinate [x=359.5, y=1213.5] is outside of element rect: [0,0][720,1184]

在我看来,出于某种原因,当调用以下任何方法时:

element.location_once_scrolled_into_view  #output: {'y': 1188, 'x': 297}
element.location  #output: {'y': 1188, 'x': 297}
element.location_in_view  #output: {'y': 1188, 'x': 297}
element.rect  #output: {'y': 1188, 'width': 125, 'height': 51, 'x': 297}

他们返回按钮的右上角,在这种情况下,我必须不x_result = x_start + width / 2,而是x_result = x_start - width / 2。然而,问题是要知道这是什么情况,因为从我调用提到的函数得到的数字中,我无法知道使用了元素的哪个角。它们似乎都返回相同的结果,我找不到任何可以返回元素范围 (x1,y1,x2,y2) 的函数,而不是 x,y,size_x,size_y。

有没有办法解决这个问题?

【问题讨论】:

    标签: python android selenium-webdriver appium-android python-appium


    【解决方案1】:

    我们正在尝试在移动设备(浏览器)上自动化一些 webapp-tests,我们也遇到了类似的问题。 DOM 中的 web 元素通常通过以下方式标识:

    driver.findElement(By.cssSelector(".some-class")).getRect().getX()
    driver.findElement(By.cssSelector(".some-class")).getRect().getWidth()
    

    等等。

    触摸屏的问题是:

    • 触摸屏(和 TouchAction)的坐标从左上角开始,从 [0,0] 到 [1080,2178],即屏幕分辨率。
    • Web 元素的坐标从可视网站区域的左下角开始。

    第一次尝试是借助 html 文档的尺寸计算触摸事件的正确坐标:

    int bodywidth =driver.findElement(By.tagName("body")).getRect().getWidth();
    int bodyheight =driver.findElement(By.tagName("body")).getRect().getHeight();
    

    但解决方案并不容易。 DOM-body 的矩形包括不可见的部分(只有向下滑动才能到达)。

    所以我们要找的是这样一个函数,它对元素本身执行动作。在这种情况下,将一些元素向左移动 100 像素:

    TouchActions scroll = new TouchActions(driver);
    scroll.scroll(some-webelement, -100,0);
    scroll.perform();
    

    仍然没有找到好的解决方案。只需使用硬编码坐标即可解决此问题,您可以使用 Playstore 中的“屏幕坐标”等工具获得。

    【讨论】:

    • 从迟到的答案队列中投票“看起来不错”,虽然这有点“我也有这个问题”,但它看起来有一些有用的信息和结论以及部分解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2021-09-18
    • 2020-08-18
    • 2020-02-28
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多