当前位置: 首页 > 知识库问答 >
问题:

如何在Selenium中在HTML5画布上执行鼠标滚轮滚动?

刘博雅
2023-03-14

我正在研究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浏览器上运行此代码。有人能建议如何解决这个问题吗?

共有2个答案

葛驰
2023-03-14

这将使用JS在当前页面中滚动特定页面

JavascriptExecutor executor = (JavascriptExecutor) getDriver();
executor.executeScript("window.scrollBy(" + start + "," + end + ")");

否则,您可以滚动直到找到WebElement,例如:

WebElement x;
JavascriptExecutor executor = (JavascriptExecutor) getDriver();
getJs().executeScript("arguments[0].scrollIntoView();", x);

谢谢

长孙波鸿
2023-03-14

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。 然后点击标题中的我的名字,我可以进入我的个人资料页面。 在我的个人资料页面上,我存储的是朋友数量的值,然后单击“朋友”链接,可以转到朋