Нажатие на элемент в iframe - Selenium Python - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть iframe, встроенный в мою веб-страницу, и я использую Selenium для автоматизации тестов:

<iframe class="wysihtml5-sandbox" security="restricted" allowtransparency="true" frameborder="0" width="0" height="0" marginwidth="0" marginheight="0" style="display: block; background-color: rgb(255, 255, 255); border-collapse: separate; border-color: rgb(163, 192, 216); border-style: solid; border-width: 1px; clear: none; float: none; margin: 0px; outline: rgb(0, 0, 0) none 0px; outline-offset: 0px; padding: 6px 12px; position: static; top: auto; left: auto; right: auto; bottom: auto; z-index: auto; vertical-align: baseline; text-align: start; box-shadow: rgba(0, 0, 0, 0.043) 0px 0.595067px 0.595067px 0px inset; border-radius: 4px; width: 100%; height: 434px;"></iframe>

Внутри iframe есть тело:

<body marginwidth="0" marginheight="0" contenteditable="true" class="form-control ng-pristine ng-untouched ng-valid ng-isolate-scope ng-empty wysihtml5-editor placeholder" spellcheck="true" style="background-color: rgb(255, 255, 255); color: black; cursor: text; font-family: &quot;Open Sans&quot;, sans-serif; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; line-height: 17.1429px; letter-spacing: normal; text-align: start; text-decoration: none solid rgb(0, 0, 0); text-indent: 0px; text-rendering: auto; word-break: normal; overflow-wrap: break-word; word-spacing: 0px;">Enter text ...</body>

Я написал следующую автоматизацию Selenium для ввода текста в это тело, которое фактически отображается в виде текстового поля:

iframes = wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, "wysihtml5-sandbox")))
if iframes:
    try:
        body = browser.find_elements_by_tag_name("body")
        for b in body:
            b.clear()
            b.send_keys(text)
        time.sleep(2)
        # switch back to the original content
        browser.switch_to.default_content()
    except Exception as e:
       print(e)

Проблема заключается в том, что всякий раз, когда я ввожу текст («foobar») и сохраняю, текст не сохранен Я заметил, что если я щелкну в поле ввода, которое представляет тело, то text будет сохранено, иначе этого не произойдет. Я думаю, кто бы ни написал код для этой страницы, он ожидал, что пользователь нажмет и введет в поле ввода (body), чтобы сохранить, когда iframe закрыт. Как я могу эмулировать тот же эффект нажатия в поле ввода iframe, чтобы исправить эту ошибку в моей автоматизации?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Вы можете попробовать следующие параметры.

вариант 1: щелкните элемент body перед вводом текста / очисткой текста.

b.click()
# use javascript click(), if normal click not worked
driver.execute_script("arguments[0].click()",b)

опция 2: Инициировать событие изменения или связанного с ним события после ввода данных в теле.

driver.execute_script("arguments[0].dispatchEvent(new Event('onchange', {'bubbles': true,'cancelable': true}));",b)

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

Обратитесь к этому post , чтобы узнать события, связанные с элементом body.

0 голосов
/ 10 февраля 2020

frame_to_be_available_and_switch_to_it ()

frame_to_be_available_and_switch_to_it () ожидание проверки того, доступен ли данный кадр для переключения. Если кадр доступен, он переключает данный драйвер на указанный кадр. Этот метод ничего не возвращает. Таким образом, независимо от состояния успеха / неудачи выполнения следующей строки кода:

iframes = wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, "wysihtml5-sandbox")))

iframes будет всегда NULL , а блок кода в if iframes: не будет быть казненным.

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

wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, "wysihtml5-sandbox")))
try:
    body = browser.find_elements_by_tag_name("body")
    for b in body:
        b.clear()
        b.send_keys(text)
    time.sleep(2)
    # switch back to the original content
    browser.switch_to.default_content()
except Exception as e:
    print(e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...