Selenium Webdriver无法清除字段,但可以向其发送send_keys

时间:2019-03-28 18:56:43

标签: python selenium

我正在尝试创建一个程序,使用新帐户注册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)

它不会清除该字段,但也不会引发错误。然后,它将继续正确输入第二封电子邮件。感谢您对此事的帮助。

编辑发布更大的代码段。

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 个答案:

答案 0 :(得分:1)

因此,这绝对可以解决。我刚刚在instagram上尝试过。尽管没有一个带有咏叹调标签的字段“ Email for me”。对我来说,这是一个带有咏叹调的“手机号码或电子邮件”标签。

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

我将继续查看它,以查看为什么清除命令仍然无效。

答案 1 :(得分:1)

您可以使用以下代码作为清除方法的替代方法:

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

答案 2 :(得分:0)

您可以尝试执行类似的操作来删除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)