Рисовать на холсте с помощью Selenium

Я использую селен с java (последний для обоих). Попытка рисовать на небольшой области холста внутри модального окна в нашем веб-приложении. Библиотека, которую мы использовали для нашего холста, называлась «signature pad js». Я подтвердил, что это не внутри iframe или чего-то сложного, что может быть проблемой (это просто обычный div.modal-body с элементом холста div.signature-input).

Но это ничего не делает. Просмотрел много сообщений здесь, в stackoverflow, и большинство из них кажутся довольно идентичными с несколькими вариантами, которые нужно попробовать (я пробовал их все).

Вот последний код, который я пробовал: // Рисуем какую-то подпись

Элемент WebElement = driver.findElement(Using.locator(SIGNATURE_AREA)); // элемент холста

Конструктор действий = новые действия (драйвер); builder.clickAndHold(элемент).moveByOffset(10, 50). двигаться по смещению (50,10). MoveByOffset(-10,-50). moveByOffset(-50,-10).release().perform();

Я пробовал всевозможные смещения, и все безрезультатно. Если у кого-то есть опыт с этим, очень хотелось бы руки.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
3 573
1

Ответы 1

Я думаю, что ваша проблема в коде, я сделал это с ruby, и это сработало нормально. Код в Ruby ниже (работает в FireFox)

driver.find_element(:xpath, "html/body/div[1]/div[5]/div[2]/canvas").click
  element = driver.find_element(:xpath, "html/body/div[1]/div[5]/div[2]/canvas");
  driver.action.move_to(element).perform
  driver.action.click_and_hold(element).perform
  driver.action.move_by(150, 50).click.perform
  driver.action.move_to(element).perform
  driver.action.click_and_hold(element).perform
  driver.action.move_by(100, 50).click.perform
  driver.action.move_to(element).perform
  driver.action.click_and_hold(element).perform
  driver.action.move_by(300, 10).click.perform
sleep (5)

Итак, я попробовал то же самое, используя Java для вас, и он работает нормально, он рисует две строки, как и ожидалось. Хитрость заключается в том, что перемещение не должно сопровождаться щелчком мыши, иначе оно потеряет фокус. Ниже код отлично работает в java и chrome. Я использовал https://sketchtoy.com/ для рисования на холсте

public class BrowserTesting {
    WebDriver driver;
    @Test
    public void test1() throws InterruptedException {
        //WebDriverManager.chromedriver().setup();
        System.setProperty("webdriver.chrome.driver","C:\\Users\\pathtyourchrome\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("useAutomationExtension", false);
        //disable automation info bar
        options.addArguments("disable-infobars");
        driver = new ChromeDriver(options);
        driver.get("https://sketchtoy.com/");

        WebElement element = driver.findElement(By.xpath("//div[@class='sketch-canvas-container']/canvas"));//canvas element
        Actions builder = new Actions(driver);
        builder.moveToElement(element).perform();
        builder.clickAndHold(element).perform();
        builder.moveByOffset(150, 50).perform();
        builder.moveToElement(element).perform();
        builder.clickAndHold(element).perform();
        builder.moveByOffset(100, 50).perform();
        builder.moveToElement(element).perform();




        Thread.sleep(5000);
        //driver.quit();

    }

}

См. этот снимок экрана для рисунка: Sketch Drawing

Дайте мне знать, если это сработало!

Проблема в каком коде извините? МОЙ код или код приложения?

killerdim 19.03.2019 03:17

ваш код, вам нужно перейти к элементу, щелкнуть и удерживать, а затем перейти

mbn217 19.03.2019 14:32

Это не имеет значения, я пробовал много комбинаций действий, ни одно из них не оставило ни одной точки на холсте.

killerdim 19.03.2019 23:36

например Конструктор действий = новые действия (драйвер); builder.moveToElement(элемент).clickAndHold(элемент).moveByO‌​ffset(1, 1).moveByOffset(2, 2).release().build().perform();

killerdim 19.03.2019 23:37

Я попробую.

killerdim 21.03.2019 03:06

У меня не сработало (не влияет на холст). На данный момент я думаю сдаться. Мне удалось поставить одну точку на холст, просто используя element.click(); что, вероятно, достаточно для моих усилий по тестированию.

killerdim 21.03.2019 03:13

Вы можете поделиться URL-адресом приложения или его частным приложением?

mbn217 21.03.2019 13:44

Это частное приложение, поэтому, к сожалению, я не могу разглашать логины.

killerdim 21.03.2019 22:24

Другие вопросы по теме