Элемент <canvas>
находится в пределах <iframe>
. Таким образом, чтобы вызвать click()
для элементов в <canvas>
, вам необходимо:
Элемент является только контейнером для графики и представляет собой прямоугольную область angular на странице HTML. По умолчанию холст не имеет границ и содержимого. Тем не менее, атрибут id
(для ссылки в сценарии), атрибут width
и height
задаются для определения размера холста. Чтобы добавить границу, используется атрибут style. Пример:
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #000000;"></canvas>
Холст HTML - это двумерная сетка. Верхний левый угол холста имеет координаты (0,0).
В статье Автоматическое тестирование HTML5 Приложения Canvas с Selenium WebDriver @ Аарон Малдер упоминает, взаимодействуя с элементы в <canvas>
возможны с использованием поддержки событий из действий Класс API:
Но не на 100% надежнее, как каждый mouse down
, mouse up
или mouse click
происходит в центре элемента. Таким образом, приведенный выше код создает событие mouse move
с указанными координатами (x
, y
), а затем событие mouse move
в центре <canvas>
затем mouse down
, mouse up
и click
в центре <canvas>
. Это должно было бы подойти для <button>
, но не стоит для <canvas>
, где вы хотите иметь возможность щелкнуть в указанном c месте.
Обходной путь - отправить синтезированную мышь события, использующие JavaScript следующим образом:
// pageX and pageY are offsets which you need to know through mouse coordinates.
((JavascriptExecutor)driver).executeScript("var evt = $.Event('click', { pageX: " + x +
", pageY: " + (y + 55) + " } );" +
"$('#myCanvas').trigger(evt);");
Однако, чтобы щелкнуть мышью по элементам в <canvas>
, вы можете спокойно использовать firefox в качестве события mouse move
хорошо работает в Firefox, и вы можете избежать использования координат мыши в качестве обработки события следующим образом:
new Actions(driver).moveToElement(
canvas, xWithinCanvas, yWithinCanvas).perform();
((JavascriptExecutor)driver).executeScript("$('#canvas').click();");
Этот сценарий использования
Для автоматизации подраздел операция напр. 3 - 1 = с использованием Selenium вы можете использовать следующие решение:
Блок кода:
driver.get("https://www.online-calculator.com/full-screen-calculator/");
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("fullframe")));
WebElement canvas = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.id("canvas")));
//clicking on 3
new Actions(driver).moveToElement(canvas, 0, 0).moveByOffset(0,(255/6)*3).click().build().perform();
//clicking on the substract sign (-)
new Actions(driver).moveToElement(canvas, 0, 0).moveByOffset((174/5)*2,(255/6)*3).click().build().perform();
//clicking on 1
new Actions(driver).moveToElement(canvas, 0, 0).moveByOffset(-(174/5)*4,(255/6)*3).click().build().perform();
//clicking on equals to sign (=)
new Actions(driver).moveToElement(canvas, 0, 0).moveByOffset((174/5)*4,(255/6)*4).click().build().perform();
Видео выполнения:
Ссылка
Вы можете найти несколько подробных обсуждений в: