Нажатие на элемент в iframe - Selenium Python

У меня есть встроенный 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 ответа


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

Вариант 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)

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

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


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)

Есть идеи?

10000