我很难找到一种方法来在特定点的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()
以下是我正在使用的网页区域的屏幕截图。
元素的大小和位置打印如下:
{'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元素来验证实际发生的点击。
如何执行点击?
答案 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
相对于前一个鼠标位置移动鼠标。使用click
或move_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();')