有没有办法显示当前光标位置或类似的东西?我有动作链,应该点击某个对象的确切点,但我想我已经选择了错误的坐标。我使用Firefox webdriver。 这是脚本的样子:
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.get("http://www.mysite/")
elem = driver.find_element_by_xpath('//div[@id="player"][1]/object[@type="application/x-shockwave-flash"]')
action_chains = ActionChains(driver)
action_chains.move_to_element_with_offset(elem, 660, 420).perform()
action_chains.click().perform()
time.sleep(10)
driver.close()
答案 0 :(得分:6)
我有一个不透明的HTML5画布,我必须在不同的偏移处检查工具提示的值,以及有什么问题!经过大量的敲击,我学到了几件重要的事情:
move_to_element_by_offset
在2.42之前有问题。另请参阅https://code.google.com/p/selenium/issues/detail?id=4215
即使在更新后,move_to_element_by_offset
仍然显得不稳定。我切换到ActionChains move_to_element
悬停(默认为元素中心)和第二个ActionChains
与move_by_offset
现在您处于适当位置,重新请求位置敏感元素。就我而言,那是一个工具提示对象。这个selenium.webdriver.remote.element
会有.location['x']
和.location['y']
个成员,您需要仔细检查自己的位置。
在perform
' d ActionChain悬停之后抓住光标位置不起作用的事情,以节省每个人的时间:
.location['x']
的元素上的.location['y']
和move_to_element
。这些值未由ActionChains
更新。switch_to_active_element
;我不清楚哪些元素符合"活跃",但它不会将我们的工具提示确认为活动元素,并且给了我[0,0]坐标。get_window_position
;文档有点模糊,但这正是函数建议的内容:窗口而不是光标位置。答案 1 :(得分:3)
这个方法可以让你通过在鼠标上画一个红点来查看它的位置: 首先将以下 CSS 临时添加到您的网页:
// TODO: Remove me after you've figured out where the mouse is moving to.
.dot {
background: red;
position: absolute;
width: 2px;
height: 2px;
z-index: 10000;
}
然后,在您的代码中,就在您调用 *.moveTo()
方法之前,添加一个暂停以允许您将代码注入浏览器的控制台。此代码使用 JavaScript (JS / webdriver.io),但可以轻松添加到任何语言中:
// Other test stuff...
console.log("This gives you 10 seconds to inject the code..."); // <-- Add this and the next line
browser.pause(10000);
browser.moveTo(...gawdKnowsWhere);
现在,当您看到测试命令行控制台等待 10 秒钟时,打开 Chrome/Firefox 的开发人员工具 (F12) 并将此代码段粘贴到浏览器的“控制台”选项卡中:
(function() {
"use strict";
document.onmousemove = handleMouseMove;
function handleMouseMove(event) {
var dot, eventDoc, doc, body, pageX, pageY;
event = event || window.event; // IE-ism
// If pageX/Y aren't available and clientX/Y
// are, calculate pageX/Y - logic taken from jQuery
// Calculate pageX/Y if missing and clientX/Y available
if (event.pageX == null && event.clientX != null) {
eventDoc = (event.target && event.target.ownerDocument) || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = event.clientX +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) -
(doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY +
(doc && doc.scrollTop || body && body.scrollTop || 0) -
(doc && doc.clientTop || body && body.clientTop || 0 );
}
// Add a dot to follow the cursor
dot = document.createElement('div');
dot.className = "dot";
dot.style.left = event.pageX + "px";
dot.style.top = event.pageY + "px";
document.body.appendChild(dot);
}
})();
现在,去寻找一个红点。无论鼠标移到哪里,它将无法点击那里,因为现在有一个红色方块挡住了路。但至少你可以看到它试图去哪里。
一些提示:
答案 2 :(得分:0)
我没有看到任何可能直接更改分辨率的方法,因为我们无法使用任何定位器。
对于您的JWPlayer示例,我确信可能会有一些javascript代码段允许更改分辨率。使用Selenium JavascriptExecutor,您可以运行该javacript代码来模拟分辨率更改..但不是通过单击光标。
WebDriver driver = new ChromeDriver();
if (driver instanceof JavascriptExecutor) {
((JavascriptExecutor) driver).executeScript(YOUR_JAVA_SCRIPT_STRING);
}
我注意到您提到您不想使用任何原生JWPlayer API。我认为这是唯一可行的解决方案。
答案 3 :(得分:0)
对于我来说,作为一个硒的新手有点难以理解,它只是无法在flash对象上产生点击。我在这里看到的唯一可行解决方案是使用sikuli-script
。
我在GitHub上找到了这个项目:https://github.com/kevlened/sikuli_cpython。它允许在纯python中使用sikuli脚本(用jython编写),所以我想我可以编写一些sikuli脚本并将它们与selenium测试集成。
答案 4 :(得分:0)
如果您只想确认 Selenium 是否点击了正确的元素,而不是对元素进行 click()
-ing:
actions.move_to_element(my_element).click().perform()
context_click()
就可以了:
actions.move_to_element(my_element).context_click().perform()
Selenium 将右键单击您的元素,这将导致上下文菜单显示在光标的右下角。一旦你看到上下文菜单的位置,你就会知道 Selenium 是否点击了正确的元素。