我正在研究GWT应用程序(类似于油漆)。在这里,我有一个HTML5画布,其中有一个功能,上下滚动鼠标滚轮将放大和缩小画布。
我搜索了很多,但没有找到解决此问题的方法。以下是我们所做的:
int PosX = 0;
int PosY = 10;
JavascriptExecutor executor = (JavascriptExecutor) getDriver();
String script = "document.getElementById('frontCanvas').scrollBy("
+ PosX + "," + PosY + ")";
executor.executeScript(script);
WebDriverWait wait = new WebDriverWait(getDriver(), 20);
wait.until(ExpectedConditions.javaScriptThrowsNoExceptions(script));
现在,上面的代码适用于另一个Angular应用程序,我在其中上下滚动div元素(有一个滚动条),但它不适用于GWT应用程序中的画布(没有滚动条)。
我使用Selenium 3.14.0,并在Chrome浏览器上运行此代码。有人能建议如何解决这个问题吗?
这将使用JS在当前页面中滚动特定页面
JavascriptExecutor executor = (JavascriptExecutor) getDriver();
executor.executeScript("window.scrollBy(" + start + "," + end + ")");
否则,您可以滚动直到找到WebElement,例如:
WebElement x;
JavascriptExecutor executor = (JavascriptExecutor) getDriver();
getJs().executeScript("arguments[0].scrollIntoView();", x);
谢谢
HTML元素用于通过JavaScript动态绘制图形。元素只是图形的容器。您必须使用JavaScript来实际绘制图形。Canvas有几种用于绘制路径、框、圆、文本和添加图像的方法。
通常,要上下滚动鼠标滚轮,我们可以选择Actions类。但根据SeleniumWebDriver对HTML5Canvas应用程序的自动测试,该API似乎不太可靠。在Firefox中,每次鼠标下压
,鼠标上压
,或鼠标点击
都发生在元素的中心。因此,上面的代码将生成一个鼠标移动
事件到所提供的(x,y),然后将鼠标移动
事件到画布的中心,然后将鼠标向下
,鼠标向上
,以及单击画布中心的所有内容。对于按钮来说,这可能很好,但对于画布来说是不可行的,在画布中,您希望能够在特定位置上
悬停
,
单击
,等等。Safari的情况更糟,它只生成一个异常,表明不支持鼠标移动事件。同时,铬也可以很好地工作。
一种解决方法是使用JavascriptExecutor接口,使用JavaScript手动调度合成的鼠标事件。
从“弗洛伦特B”身上取一片叶子s答案,要上下滚动鼠标滚轮,可以通过脚本注入将mouseover、mousemove和wheel事件发送到顶部元素,并且可以使用以下解决方案:
>
代码块:
package demo;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Canvas {
static WebDriver driver;
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized");
options.addArguments("disable-infobars");
options.addArguments("--disable-extensions");
driver = new ChromeDriver(options);
driver.get("https://www.google.co.uk/maps");
WebElement elm = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#scene > div.widget-scene > canvas")));
// Mouse wheel UP or Zoom In
wheel_element(elm, -500, 0, 0);
System.out.println("Mouse wheel UP or Zoom In through Wheel achieved !!!");
// Mouse wheel DOWN or Zoom Out
wheel_element(elm, 120, 0, 0);
System.out.println("Mouse wheel DOWN or Zoom Out through Wheel achieved !!!");
System.out.println("Mouse Scroll through Wheel achieved !!!");
}
public static void wheel_element(WebElement element, int deltaY, int offsetX, int offsetY)
{
try{
String 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;"
+"}"
+"}";
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].parentNode;", element);
((JavascriptExecutor) driver).executeScript(script, parent, deltaY, offsetX, offsetY);
}catch(WebDriverException e)
{
System.out.println("Exception caught in Catch block");
}
}
}
控制台输出:
Mouse wheel UP or Zoom In through Wheel achieved !!!
Mouse wheel DOWN or Zoom Out through Wheel achieved !!!
Mouse Scroll through Wheel achieved !!!
您可以在以下网站找到一些相关的详细讨论:
如何找到画布上按钮的坐标,并在使用Java和硒后点击它们?
问题内容: 在鼠标滚轮上滚动它执行水平滚动。 已编辑 好吧,firebug说他在用 问题答案: 看来他只是将mousewheel事件映射到滚动区域。在IE中,仅通过使用方法就非常容易-滚动水平条的量为垂直条通常滚动的量。其他浏览器不支持该方法,因此您必须随心所欲地滚动任意数量:
问题内容: 我的意思是滚动时会轻松。 问题答案: var $pages = $(“.page”), PS: 使用,如果你的s为像一个滚动的DIV内(而不是) 注意: 对于 移动设备, 您可能希望针对浏览器的标签栏高度调整值(最好还是完全避免这种情况)。你有主意
我有一个JScrollPane,它的内容窗格是一个JXList。当我在列表上使用鼠标滚轮时,列表一次执行三(3)项。这也适用于表,无论行高如何。我如何改变这一点,使-无论平台-列表和表的滚动距离正好是1项?设置块增量不会削减它,因为表中的某些行具有不同的高度。
我的问题是: 我的解决方案是使用mousewheel/scroll事件处理程序来知道用户是否在移动,然后计算我是否在页面底部并隐藏或显示元素。。。 一切正常,但我有点担心 由于主线程正忙,“mousewheel”输入事件的处理延迟了123毫秒。将事件处理程序标记为“被动”以使页面更加响应。 这(我猜)是因为这个代码 跑太多次了。 那么,我怎样才能使这段代码更有效率呢 是否有办法在滚动后运行事件?
问题内容: 我有一个JScrollPane,其内容窗格是JXList。当我在列表上使用鼠标滚轮时,该列表一次执行三(3)个项目。无论行高如何,这也适用于表格。我如何更改此设置,以便无论平台如何,列表和表格的滚动距离都仅为1?设置块增量不会削减它,因为表中的某些行具有不同的高度。 问题答案: 出于纯粹的兴趣(有点无聊),我创建了一个工作示例: 真正的魔力是在custom中完成的,我们每次都将当前的“
问题内容: 我正在尝试捕获/自动执行Selenium IDE中的鼠标滚动事件。像在Facebook朋友列表页面中一样,我们必须滚动到末尾以列出所有朋友。 我想使用Selenium IDE自动化该功能。 我做了什么 : 使用我当前的脚本,我可以登录Facebook。 然后点击标题中的我的名字,我可以进入我的个人资料页面。 在我的个人资料页面上,我存储的是朋友数量的值,然后单击“朋友”链接,可以转到朋