Моя цель - автоматически заполнить форму на https://mail.protonmail.com/ create / new? language = en с помощью селена.

Я могу ввести пароль, но мне все еще не удается ввести имя пользователя.

Поле имени пользователя находится внутри iframe. HTML-код для указанного iframe следующий:

<iframe title="Registration form" scrolling="no" class="top" data-name="top" sandbox="allow-scripts allow-same-origin allow-popups allow-top-navigation" src="https://secure.protonmail.com/abusev2.iframe.html?name=top">
    #document
        <!DOCTYPE html>
        <html lang="en">
        <head>...</head>
        <body>
            <div id="app" data-name="top">
                <div class="formList">
                    <div class="field field-usernameInput">
                        <div class="group-username">
                            <label for="username">Choose username</label>
                            <input placeholder="Choose username" required="" name="username" messages="[object Object]" iframename="top" pattern=".{1,40}" id="username" class="input">
                            <div class="field field-select"><label for="domain">Select a domain</label><div class="select-mask"><select component="domains" name="domain" id="domain"><option value="protonmail.com">protonmail.com</option><option value="protonmail.ch">protonmail.ch</option></select><i>▼</i></div></div>
                        </div>
                    </div>
                </div>
            </div>
    
    </iframe>

Чтобы переключить селен на iframe, я использовал

driver.switch_to.frame(driver.find_element_by_tag_name('iframe'))

Это не является исключением. Однако теперь я не могу найти входной объект для выполнения .send_keys ().

Я пытался

driver.find_element_by_id('username')
driver.find_element_by_class_name('input')
driver.find_element_by_tag_name('input')
driver.find_element_by_name('username')
driver.find_element_by_xpath('//input[@id="username"]')
driver.find_element_by_css_selector('#username')

Но каждый раз получаю одно и то же исключение:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: *whatever I searched for*

Когда я попробовал

driver.find_element_by_id('app') #first div object in the iframe

Никаких исключений не было. Если я не переключаюсь на iframe, я не могу этого найти, что наводит меня на мысль, что переключение на iframe сработало. Однако я не могу найти какие-либо другие объекты div ни одним из упомянутых методов.

В заключение: я понятия не имею, почему я не могу найти входной объект с селеном для автоматического ввода послесловия имени пользователя, и был бы очень признателен за идеи о том, что я делаю неправильно.

1
Sean 2 Мар 2021 в 01:49

1 ответ

Лучший ответ

Это приведет к тому, что первый iframe будет использовать более целевой xpath.

driver.switch_to.frame(driver.find_element_by_xpath("(//iframe[@title='Registration form'])[1]"))

Итак, чтобы настроить таргетинг на первый iframe, дождаться имени пользователя и отправить ему ключ.

wait = WebDriverWait(driver, 10)
driver.get('https://mail.protonmail.com/create/new?language=en')
wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"(//iframe[@title='Registration form'])[1]")))
wait.until(EC.element_to_be_clickable((By.XPATH,"(//div[@class='group-username'])[1]/input"))).send_keys('a')

Импортировать

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
2
Arundeep Chohan 1 Мар 2021 в 23:12