from selenium import webdriver
from selenium.common.exceptions import WebDriverException
def wheel_element(element, deltaY = 120, offsetX = 0, offsetY = 0):
error = element._parent.execute_script("""
var element = arguments[0];
var deltaY = arguments[1];
var box = element.getBoundingClientRect();
var clientX = box.left + (arguments[2] || box.width / 2);
var clientY = box.top + (arguments[3] || box.height / 2);
var target = element.ownerDocument.elementFromPoint(clientX, clientY);
for (var e = target; e; e = e.parentElement) {
if (e === element) {
target.dispatchEvent(new MouseEvent('mouseover', {view: window, bubbles: true, cancelable: true, clientX: clientX, clientY: clientY}));
target.dispatchEvent(new MouseEvent('mousemove', {view: window, bubbles: true, cancelable: true, clientX: clientX, clientY: clientY}));
target.dispatchEvent(new WheelEvent('wheel', {view: window, bubbles: true, cancelable: true, clientX: clientX, clientY: clientY, deltaY: deltaY}));
return;
}
}
return "Element is not interactable";
""", element, deltaY, offsetX, offsetY)
if error:
raise WebDriverException(error)
options = webdriver.ChromeOptions()
options.add_argument("--disable-infobars --disable-extensions --window-size=1366,768")
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.google.co.uk/maps")
# get element
elm = driver.find_element_by_css_selector("#scene > div.widget-scene > canvas")
# zoom in with mouse wheel
wheel_element(elm, -120)
# zoom out with mouse wheel
wheel_element(elm, 120)
作为替代,你可以发送谷歌Map+/-的缩放快捷键:
# get element
elm = driver.find_element_by_css_selector("#scene > div.widget-scene > canvas")
# zoom in with shortcut
elm.send_keys("+")
# zoom out with shortcut
elm.send_keys("-")
/* global arguments */
(function (element, deltaY, offsetX, offsetY) {
var box = element.getBoundingClientRect();
var clientX = box.left + (offsetX || box.width / 2);
var clientY = box.top + (offsetY || box.height / 2);
var target = element.ownerDocument.elementFromPoint(clientX, clientY);
for (var e = target; e; e = e.parentElement) {
if (e === element) {
target.dispatchEvent(new MouseEvent("mouseover", {
view: window,
bubbles: true,
cancelable: true,
clientX: clientX,
clientY: clientY
}));
target.dispatchEvent(new MouseEvent("mousemove", {
view: window,
bubbles: true,
cancelable: true,
clientX: clientX,
clientY: clientY
}));
target.dispatchEvent(new WheelEvent("wheel", {
view: window,
bubbles: true,
cancelable: true,
clientX: clientX,
clientY: clientY,
deltaY: deltaY
}));
return "";
}
}
return "Element is not interactable";
}).apply(null, arguments);
然后可以将其读取并用于以下内容
# Load it using the module loader, the module in this example is called "helper_js"
# Alternatively, simple read functions could be used
import pkgutil
wheel_js = pkgutil.get_data("helper_js", "simulate_wheel.js").decode("utf8")
def simulate_wheel(element, deltaY=120, offsetX=0, offsetY=0):
error = element._parent.execute_script(wheel_js, element, deltaY, offsetX, offsetY)
if error:
raise WebDriverException(error)
5条答案
按热度按时间vpfxa7rd1#
要复制/测试鼠标滚轮,您必须使用脚本注入将
mouseover
、mousemove
和wheel
事件发送到顶部元素。以下是谷歌Map的一个实用示例:
作为替代,你可以发送谷歌Map+/-的缩放快捷键:
wd2eg0qa2#
在谷歌Map上,有一个放大/缩小按钮。你可以用它来代替鼠标滚动。
//点击放大
//点击缩小
js5cn81o3#
如果将JS代码片断外包到一个单独的文件中,并将其 Package 成带有可读参数名称的旧式JS模块格式,则可能会有一点改进。
名为
simulate_wheel.js
的文件,其中包含:然后可以将其读取并用于以下内容
这类似于它是如何深入到Python的Selify绑定中的。
70gysomp4#
您可以尝试使用PyRobot类,首先将焦点放在要执行放大/缩小操作的点上,然后使用PyRobot类通过键盘键执行放大/缩小操作。
kxeu7u2r5#
编辑:附注。这是为了使用Chrome版本107.0.5304.88和Selify版本4.6.0(截至本文的最新版本)。
我试了那么多方法,但都不管用。太多了。我不确定这是否是Selify或Python的版本问题,但这确实是一件痛苦的事情,文档也没有帮助。
然后,我偶然发现有人在C#中为Selence编写代码,他们的解决方案略有不同。针对Python进行了调整,这对我很管用:
祝好运!希望这能帮助其他人。