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