使用 selenium 2 在网络浏览器中的任意位置单击(Python 绑定)

click at at an arbitrary position in web browser with selenium 2 (Python binding)

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

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

...
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>

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

如何执行点击?

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

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 if you want the mouse position to be relative to an element. Otherwise, move_by_offset moves the mouse relative to the previous mouse position. When you using click or move_to_element, the mouse is placed in the center of the element. (The Java documentation 关于这些是明确的。)

很难说出具体情况,但我知道摘要和粗体中问题的解决方法

send the left-click in a web browser window in a specific point

您只需使用 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();')