【问题标题】:click at at an arbitrary position in web browser with selenium 2 (Python binding)使用 selenium 2(Python 绑定)在 Web 浏览器中的任意位置单击
【发布时间】:2015-03-12 23:02:30
【问题描述】:

我在试图找到一种方法来在特定点在网络浏览器窗口中发送左键时感到困惑。我正在使用 Selenium selenium-2.44.0 和 Python 2.7。我的最终目标是能够点击窗口中的某些区域,但现在我只想确保我能够点击。我认为点击链接所在的区域是个好主意,因为这样我就可以验证点击确实发生了(即,我将被带到另一个 html 页面)。

满足所有先决条件,我能够启动浏览器并访问和操作各种网络元素。根据我在帮助中找到的内容,应该使用move_by_offset 方法将鼠标光标移动到某个方向。但是,当我运行代码时,点击没有发生(或者它发生了,但是没有点击 url 链接并且没有打开新页面)。我什至无法验证点击是否发生。例如,在正常浏览器会话中单击注销链接时,会发生注销操作。

...
homeLink = driver.find_element_by_link_text("Home")
homeLink.click() #clicking on the Home button and mouse cursor should? stay here
print homeLink.size, homeLink.location

helpLink = driver.find_element_by_link_text("Help")
print helpLink.size, helpLink.location

action = webdriver.common.action_chains.ActionChains(driver)
action.move_by_offset(150,0) #move 150 pixels to the right to access Help link
action.click()
action.perform()

这是我正在使用的网页区域的屏幕截图。

元素的大小和位置打印如下:

{'width': 39, 'height': 16} {'y': 47, 'x': 341}
{'width': 30, 'height': 16} {'y': 47, 'x': 457}

页面后面的html代码如下,如果值得一看。

<a href="/web/">Home</a>
|
<a href="/web/Account/LogOff">Logout</a>
|
<a href="#" onclick="HelpFile.open();">Help</a>

我知道我可以通过多种方式查找元素来访问链接,但我试图在某个位置执行点击,并且我使用链接元素只是为了验证点击确实发生了。

如何执行点击?

【问题讨论】:

  • 您是如何计算 150 像素偏移以访问帮助链接的?
  • @shri046,我发现主页链接和帮助链接的 x 坐标之间的差异(在问题正文中打印 element.size)。我还通过使用 Firefox 的 MeasureIt 插件验证了这一点。
  • 根据我的经验,点击总是发生在元素的中间(中心)。所以homeLink.click() 的鼠标指针可能会位于主链接元素的 x + (width/2) 处。在计算需要移动到的最终偏移量时,您可能必须考虑到这一点。
  • 这是一个非常有效的观点,谢谢。我将使用各种偏移值进行更多测试。

标签: python python-2.7 selenium selenium-webdriver


【解决方案1】:

假设您的页面上没有其他事情会干扰点击,那么应该这样做:

homeLink = driver.find_element_by_link_text("Home")
homeLink.click() #clicking on the Home button and mouse cursor should? stay here
print homeLink.size, homeLink.location

helpLink = driver.find_element_by_link_text("Help")
print helpLink.size, helpLink.location

action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(homeLink, 150, 0) #move 150 pixels to the right to access Help link
action.click()
action.perform()

如果您希望鼠标位置相对于某个元素,则应使用move_to_element_with_offset。否则,move_by_offset 相对于前一个鼠标位置移动鼠标。当您使用clickmove_to_element 时,鼠标位于元素的中心。 (关于这些的Java documentation 是明确的。)

【讨论】:

  • 嘿@Louis,感谢您的帮助。我已经编辑了我的问题,指定我首先提交点击主页按钮。它是否将鼠标光标移到主页按钮上?如果是这样,那么我希望 move_by_offset 将光标从 Home 按钮向右移动。我弄错了吗?
  • @AlexTereshenkov 您是否尝试过我编写的代码并解决了问题?请注意,在得到像我这样的答案后,像您一样更改您的问题通常不是一个好主意,因为这会使回答您问题早期版本的人看起来好像他们没有注意您写的内容。跨度>
  • 您的回答在我编辑后仍然有效,但我会记住您的说明。您发布的代码确实有效,但无论我指定什么偏移量(例如 500,500),它都会单击“帮助”按钮。我认为我在问题中指定的另一件事是我不知道我必须将鼠标光标移动到哪个元素。我只是希望能够从已知位置向右移动 150 像素,然后在不知道其下方是什么的情况下左键单击。帮助/主页链接仅用于可视化和工作流验证目的。
  • 我对这段代码的工作方式有点困惑。偏移量是从指定元素的左上角开始的,所以理想情况下点击应该发生在帮助链接之外?我问的原因是因为similar issues 其他人已经报告了这个功能。
  • @shri046 我在那里引用了错误的元素。现已修复。
【解决方案2】:

很难告诉你确切的情况,但我知道摘要和粗体中问题的解决方法

在网络浏览器窗口中的特定点发送左键点击

您只需使用 execute_script 并使用 javascript 进行点击。

self.driver.execute_script('el = document.elementFromPoint(47, 457); el.click();')

这很方便,因为您可以通过打开控制台并使用 querySelector(与 Webdriver 的 By.CSS_SELECTOR 相同)来调试在浏览器中查找元素的坐标:

el = document.querySelector('div > h1');
var boundaries = el.getBoundingClientRect();
console.log(boundaries.top, boundaries.right, boundaries.bottom, boundaries.left);

话虽如此,编写测试以单击特定点是一个非常糟糕的主意。但我发现,有时即使 el.click() 或 action chain 不起作用,执行脚本仍然可以使用 querySelector 工作,这与您在 Selenium 中所做的差不多。

self.driver.execute_script('el = document.querySelector("div > h1"); el.click();')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多