代码之家  ›  专栏  ›  技术社区  ›  RamanaMuttana

无法使用Selenium WebDriver在画布上定位元素

  •  0
  • RamanaMuttana  · 技术社区  · 8 年前

    我有一个使用Vaadin框架开发的应用程序,现在我需要单击画布上的矩形多边形。下面是html代码 这里我提供了Html代码

    <canvas width="1920" height="524" class="ol-unselectable" style="width: 100%; height: 100%;"></canvas>
    

    我尝试使用一些动作,让鼠标在多边形上移动并单击。

    int x = (int) 5638326.333511386;
    int y = (int)  2580101.9711508946;
    driver.get("http://localhost:8080/internship");
    
    WebElement ele = driver.findElement(By.xpath("//canvas[@class='ol-unselectable']"));
            //  driver.findElement(By.tagName("canvas"));
            //driver.findElemet(By.className("ol-unselectable"));
    try {
        Actions builder = new Actions(driver);
        builder.moveToElement(ele, x, y);
        builder.clickAndHold();
        builder.release();
        builder.perform();
        } catch (Exception e) {
            // do nothing
        }
    

    我收到以下错误

    组织。openqa。硒。NoTouchElementException:无法定位元素: //画布[@class='ol-不可选择']。

    有没有人可以建议一些示例,如何在画布上找到带坐标的多边形并单击它。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Thiago Procaci    8 年前

    通常,canvas元素嵌入在iframe中。 因此,首先,您必须找到iframe元素,然后在iframe中找到画布。例如:

    WebDriver driver = new FirefoxDriver(firefoxOptions);
            try {
                driver.get("https://www.w3schools.com/html/tryit.asp?filename=tryhtml5_canvas_empty");
                WebElement iframe = driver.findElement(By.name("iframeResult"));
                driver.switchTo().frame(iframe);
                WebElement canvas = driver.findElement(By.id("myCanvas"));
                System.out.println(canvas.getText());
            } finally {
                driver.quit();
            }
    

    我认为这段代码可能会对您有所帮助。

    编辑: 在与@RamanaMuttana和他就张贴的问题所做的更改进行了交谈之后,我可以更好地理解他的需要。

    我们意识到,只需使用By。标记名选择器足以找到画布元素,如下面的代码所示:

    driver.findElements(By.tagName("canvas")).get(0);