Как получить доступ к кнопке с помощью Selenium, когда кнопка, кажется, сгенерирована из JavaScript

#java #javascript #selenium #selenium-webdriver

#java #javascript #selenium #selenium-webdriver

Вопрос:

Я пытаюсь запустить несколько тестов на веб-странице. Я новичок, и до сих пор все шло довольно гладко.

Я меняю некоторые значения в веб-форме и теперь хочу нажать кнопку «Сохранить и выйти». введите описание изображения здесь

Но когда я смотрю на доступный источник с помощью webdriver ( driver.getPageSource(); ) , я не вижу кнопки, только приведенный ниже JavaScript. Я сократил скрипт до одной кнопки — одной кнопки, которую я хотел бы нажать.

 function getToolbarCfg() {
  return [{ btnId: 2, icon:'images/obj16/tsave_.gif', text:'Save amp; Exit', qtip:'Save Record and Exit', handler:function() { cwc.getCenterWindow().tpzExecute('2',null,'detail'); } }];
  

Любая помощь приветствуется.

Ответ №1:

Вы можете заставить WebDriver явно ожидать появления элемента.

     public static IWebElement WaitForElementToAppear(IWebDriver driver, int waitTime, By waitingElement)
    {
        IWebElement wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTime)).Until(ExpectedConditions.ElementExists(waitingElement));
        return wait;
    }
  

Ознакомьтесь с документацией ожидания веб-драйвера Selenium для хорошего объяснения явных и неявных ожиданий.

Редактировать:

В качестве альтернативы вы могли бы сделать это:

 public static IWebElement WaitForElementToAppear(IWebDriver driver, int waitTime, By waitingElement)
    {
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTime));
        var element = wait.Until(d =>
        {
            var elem = driver.FindElement(waitingElement);
            if (elem.Enabled)
                return elem;
            else return null;
        });
        return element;
    }
  

Это будет проверять элемент каждые .5 секунд, пока не будет определено какое-либо время ожидания или не будет ИЛИ пока элемент не будет присутствовать.

Ответ №2:

Найдено решение:

При нажатии на кнопку выполняется JavaScript. Можно напрямую вызвать эту функцию JavaScript с помощью Selenium WebDriver.

 ((JavascriptExecutor) driver).executeScript("cwc.getCenterWindow().tpzExecute('3',null,'detail');");
  

Надеюсь, этот ответ поможет людям, испытывающим те же проблемы.

Комментарии:

1. и было бы неплохо, если бы человек, который отклонил мое прекрасное рабочее решение, мог хотя бы объяснить причину, по которой он решил это сделать.

2. Приносим извинения, вчера вечером возникли проблемы при попытке опубликовать комментарий. Причина, по которой я проголосовал, заключается в том, что прямое выполнение JavaScript фактически не тестирует приложение. Вы говорите, что пишете тесты, но на самом деле вы не доказываете, что эти кнопки работают или даже есть. Короче говоря, ваш тест не делает то, что сделал бы пользователь. Использование JavaScript должно быть абсолютно последним средством при попытке протестировать веб-страницу. Вы пробовали ждать появления кнопок в DOM? Нужно ли запускать такое событие, как наведение курсора мыши?

3. что ж, это хороший ввод. Спасибо. Я перевел свой поток в спящий режим на 2 секунды. После этого интервала кнопок нет. Есть ли у вас какие-либо предложения о том, как я мог бы перейти к моделированию более «пользовательского сценария» с фактическим нажатием кнопки?

4. Можете ли вы опубликовать ссылку на общедоступный веб-сайт?

5. Вы можете заставить Selenium подождать, пока на странице не появится определенная кнопка, а затем нажать эту кнопку. Проблема в том, что не существует единого способа представления кнопок в HTML. Другое дело, что click() это не всегда работает по какой-либо причине, поэтому иногда может потребоваться выполнение фрагментов JavaScript. Что не уменьшает обоснованность замечания Робби Варэма.