Как нажать на <textarea>в соответствии с HTML ниже? - PullRequest
0 голосов
/ 03 июля 2018

Я работаю над огромным проектом автоматизации, и это моя ПОСЛЕДНЯЯ ПРОБЛЕМА, прежде чем я смогу завершить этот проект. Я использую Selenium для автоматизации изменений на сайте в стиле Drupal. До сих пор мне удавалось щелкать и взаимодействовать с каждым веб-элементом на сайте (особенно после того, как я перестал использовать драйвер chrome, который по какой-либо причине не может щелкать элементы, заключенные в теги <div>?). Во всяком случае, я недавно обнаружил, что (при использовании Geckodriver FireFox, FYI) я не могу нажать на <textarea> веб-элементы . При этом я получаю следующую ошибку:

Element <textarea id="edit-body-und-0-value" class="text-full wysiwyg form-textarea wysiwyg-processed" name="body[und][0][value]"> could not be scrolled into view

Вот мой соответствующий код и HTML:

Java

WebElement description = driver.findElement(By.id("edit-body-und-0-value"));
description.click();
description.clear();
description.sendKeys(desiredString);

HTML

<div class="field-type-text-with-summary field-name-body field-widget-text-textarea-with-summary form-wrapper" id="edit-body">
    <div id="body-add-more-wrapper">
        <div class="text-format-wrapper">
            <div class="text-summary-wrapper"></div>
            <div class="form-item form-type-textarea form-item-body-und-0-value">
                <label for="edit-body-und-0-value">Description </label>
                <div class="form-textarea-wrapper resizable"><textarea class="text-full wysiwyg form-textarea" id="edit-body-und-0-value" name="body[und][0][value]" cols="60" rows="20">&lt;p&gt;Specific projects are dependent on students&amp;#39; interests, backgrounds, and classes completed.&lt;/p&gt;</textarea></div>
            </div>
            <fieldset class="filter-wrapper form-wrapper" id="edit-body-und-0-format">
                <div class="fieldset-wrapper">
                    <div class="filter-help form-wrapper" id="edit-body-und-0-format-help">
                        <p><a href="/filter/tips" target="_blank">More information about text formats</a></p>
                    </div>
                    <div class="form-item form-type-select form-item-body-und-0-format">
                        <label for="edit-body-und-0-format--2">Text format </label>
                        <select class="filter-list form-select" id="edit-body-und-0-format--2" name="body[und][0][format]"><option value="filtered_html" selected="selected">Filtered HTML</option><option value="full_html">Full HTML</option><option value="plain_text">Plain text</option></select>
                    </div>

Я использовал много разных способов поиска веб-элемента и могу пообещать, что этот метод вызовет правильный элемент текстовой области. Я даже пытался нажать на элемент <div>, но безрезультатно. Следующие методы также потерпели неудачу:

Использование библиотеки действий в Selenium примерно так:

Actions desc = new Actions(driver);
desc.moveToElement(description).click();
Action doIt = desc.build();
doIt.perform();

Сбой с: Exception in thread "AWT-EventQueue-0" org.openqa.selenium.WebDriverException: TypeError: rect is undefined

Использование Javascript Executor ничего не делает, кроме прокрутки к элементу. Нажатие только щелкает в верхнем правом углу экрана.

Использование WebDriverWait объекта истекло, потому что элемент никогда не становится кликабельным во времени.

Я понятия не имею, что делает нажатие на этот элемент настолько сложным, но я думаю, что натолкнулся на подсказку сегодня. Я не специалист по тому, как работает JQuery (или JS в целом), но этот скрипт находится вверху страницы:

jQuery.extend(Drupal.settings, {"basePath":....

В довольно большом сценарии единственные идентификаторы элементов, которые являются элементами, прикрепляются к объекту, называемому «триггеры». Вот часть сценария:

 "triggers": {
            "edit-field-office-address-und-0-value": {
                "field": "edit-field-office-address-und-0-value",
                "resizable": 1,
                "select": "edit-field-office-address-und-0-format--2",
                "formatfiltered_html": {
                    "editor": "ckeditor",
                    "status": 1,
                    "toggle": 1
                }
            },
            "edit-body-und-0-value": {
                "field": "edit-body-und-0-value",
                "resizable": 1,
                "select": "edit-body-und-0-format--2",
                "formatfiltered_html": {
                    "editor": "ckeditor",
                    "status": 1,
                    "toggle": 1
                }
            },
            "edit-field-requirements-und-0-value": {
                "field": "edit-field-requirements-und-0-value",
                "resizable": 1,
                "select": "edit-field-requirements-und-0-format--2",
                "formatfiltered_html": {
                    "editor": "ckeditor",
                    "status": 1,
                    "toggle": 1
                }
            }
        }
    },

Я думаю, что Javascript каким-то образом портит опцию щелчка. Может быть, он создает параметры форматирования, из-за которых элемент кажется неприкосновенным?

Я понятия не имею, что делать, и срок приближается! Буду признателен за любую помощь в выяснении, как нажимать и взаимодействовать с этой текстовой областью!

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Ранее я сталкивался с подобной проблемой, когда элементы не фиксируются драйвером, когда они не отображаются на экране, даже если они присутствуют на веб-странице (для их обработки необходимо прокрутить вверх или вниз). После проверки моего проекта я обнаружил, что проблема вызвана устаревшим драйвером Chrome.

Вот мои предложенные решения:

  1. Попробуйте отладку, установив точку останова непосредственно перед тем, как вы найдете свой элемент textarea. Когда выполнение отладки приостанавливается в точке останова, прокрутите страницу так, чтобы текстовая область была видна. Продолжите выполнение. Если проблема все еще встречалась, возможно, вам придется проверить ваш селектор. Но если при вмешательстве с прокруткой вручную проблем не возникало, возможно, это проблема с драйвером или браузером.

  2. Убедитесь, что ваш драйвер Chrome обновлен, а также браузер Chrome, установленный на вашем компьютере. Последний выпуск драйвера Chrome обычно размещается здесь: http://chromedriver.chromium.org/downloads

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

Вот пример кода:

Actions actions = new Actions(driver);
    actions
        .moveToElement(anyVisibleElement)
        .sendKeys(Keys.PAGE_UP)
        .build()
        .perform();
0 голосов
/ 03 июля 2018

Чтобы щелкнуть текстовую область с текстом по умолчанию как Конкретные проекты зависят от интересов, фона и классов учащихся. вам нужно заставить WebDriverWait для желаемого элемент для кликабельности следующим образом:

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("textarea.text-full.wysiwyg.form-textarea#edit-body-und-0-value>p"))).click();
    
  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//textarea[@class='text-full wysiwyg form-textarea' and @id='edit-body-und-0-value']/p"))).click();
    
0 голосов
/ 03 июля 2018

Вы можете использовать попробовать ниже

WebDriverWait wait = new WebDriverWait(driver, 5)
JavascriptExecutor js = ((JavascriptExecutor) driver)

//Present in DOM
wait.until(ExpectedConditions.presenceOfElement(By.id("ID")));

//scroll to view
WebElement element = driver.findElement(By.id("ID")));  
js.executeScript("arguments[0].scrollIntoView(true);", element);

//Click
wait.until(ExpectedConditions.elementToBeClickable(By.id("ID")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...