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

时间:2015-01-14 17:00:58

标签: python python-2.7 selenium selenium-webdriver

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

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

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

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

enter image description here

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

{'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元素来验证实际发生的点击。

如何执行点击?

2 个答案:

答案 0 :(得分:2)

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

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是明确的。)

答案 1 :(得分:2)

很难说出确切的情况,但我知道摘要和粗体

中的问题的解决方法
  

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

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