Веб-драйвер Selenium не может очистить поле, но может отправить на него send_keys - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь создать программу, которая регистрируется в Instagram с новой учетной записью, у меня есть электронные письма и остальная часть сгенерированных, когда я продолжаю и посылаю send_keys в соответствующие поля, это прекрасно работает.Я хотел реализовать функцию повтора, которая бы очищала поле электронной почты и пробовала другую почту.Однако это не работает, хотя send_keys к нему работал ранее?Фрагмент моего кода ниже.

driver.get('https://www.instagram.com')
driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").send_keys(mail)
driver.find_element_by_xpath("//*[contains(@aria-label,'Full')]").send_keys(name + lastname)
driver.find_element_by_xpath("//*[contains(@aria-label,'User')]").send_keys(namae+lastonamae+pamae2)
driver.find_element_by_xpath("//*[contains(@aria-label,'Password')]").send_keys(password)
driver.find_element_by_xpath("//*[contains(@type,'submit')]").click()

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

driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[2]/div[1]/div/form/div[3]/div/div[2]/span') #this looks for the element only present on the fail page
driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").clear()
driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").send_keys(mail2)

Не очищает поле, но и не вызывает ошибку.Затем он продолжает вводить 2-е письмо без проблем.Я признателен за любую помощь по этому вопросу.

РЕДАКТИРОВАТЬ: Опубликовать больший кусок кода.

def signup():
    driver.get('https://www.instagram.com')
    time.sleep(7)
    if trycounter < 3:  #this is almost always true, just a failsafe
            driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").send_keys(mail1)
            driver.find_element_by_xpath("//*[contains(@aria-label,'Full')]").send_keys(name + ' ' + lastname)
            driver.find_element_by_xpath("//*[contains(@aria-label,'User')]").send_keys(name+lastname+extension)
            driver.find_element_by_xpath("//*[contains(@aria-label,'Password')]").send_keys(password)
            driver.find_element_by_xpath("//*[contains(@type,'submit')]").click()
            time.sleep(7)  
            try: #this only executes if a popup that wants you to confirm your age pops up
                    driver.find_element_by_xpath('//*[@id="igCoreRadioButtonageRadioabove_18"]').click() 
                    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div/button').click()
                    time.sleep(5)
            except:
                    pass
            try:
                    randomgen() #generates the mail,password and name
                    driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[2]/div[1]/div/form/div[3]/div/div[2]/span')
                    time.sleep(1)
                    driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").clear()
                    time.sleep(1)
                    driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").send_keys(mail2)
                    driver.find_element_by_xpath("//*[contains(@aria-label,'User')]").send_keys(username)
                    driver.find_element_by_xpath("//*[contains(@type,'submit')]").click()
                    time.sleep(7)

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Так что это определенно будет работать в качестве обходного пути.Я только что попробовал это на Instagram.Хотя для меня не было поля с ярлыком арии под названием Email.Для меня это был ярлык арии «Номер мобильного телефона или адрес электронной почты».

driver.execute_script("$(\"input[aria-label='Email']"\").value = '';");

Я буду продолжать смотреть на него, чтобы понять, почему команда очистки не сработала.

1 голос
/ 28 марта 2019

Вы можете использовать следующий код в качестве альтернативы для метода очистки:

from selenium.webdriver.common.keys import Keys
email_element = driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]")
email_element.send_keys(Keys.CONTROL, 'a')
email_element.send_keys(mail1)

fullname_element = driver.find_element_by_xpath("//*[contains(@aria-label,'Full')]")
fullname_element.send_keys(Keys.CONTROL, 'a') 
fullname_element.send_keys(name + ' ' + lastname)

# do it for other field as well
0 голосов
/ 28 марта 2019

Вы можете попробовать что-то вроде этого, чтобы удалить mail1.

driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").send_keys(Keys.chord(Keys.CONTROL,"a"))
driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").send_keys(Keys.DELETE)
driver.find_element_by_xpath("//*[contains(@aria-label,'Email')]").send_keys(mail2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...