我正在创建一个python脚本,可以自动为学生创建用户帐户,但它无法正常工作。该脚本从excel文件中提取名称,电子邮件和密码,并将其填入网页上的相应表单,然后等待用户输入验证码并按Enter键。然后它会在重新加载并创建下一个元素之前等待从确认页面检测一个元素。
我的程序一致地为第一个用户工作,但在重新加载页面之后,在填写表单之前,它会抛出StaleElement异常。我一直在搜索并看到这是因为它找不到它在页面上搜索的元素,所以我尝试了各种类型的等待以确保页面完全加载。即使有这些等待,它仍然会抛出异常。已经有几次和实现,在重新加载之后,它将填充一些字段然后抛出异常。我的代码的主要方法如下 - 如果需要任何其他位,我可以提供它们。
for i in xrange(sheet.nrows):
driver.get("url")
wait.until(EC.presence_of_element_located((By.ID, "id-of-element")))
time.sleep(.5)
read_from_config() #reads from a config file so the script knows which values to put where
fill_common_forms() #method that fills forms that are the same for all users
fill_specific_forms(i) #method that pulls from excel for user-specific data
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
while True: #waits until the correct captcha has been entered
handle_captcha(i)
try:
while True:
if (driver.find_element_by_id("verify-your-email")):
break
time.sleep(1)
break
except selenium.common.exceptions.NoSuchElementException:
continue
file.write("Account created for user "+sheet.row(i)[2].value+" with password "+sheet.row(i)[3].value+"\n")
我甚至尝试关闭驱动程序并为每个循环创建一个新会话,但这也会抛出异常。有什么想法吗?
答案 0 :(得分:-1)
好吧,所以我想出了什么是错的,所以我只是为后人发布这个。
我以为我收到了StaleElementReferenceException,因为脚本最初是在找到元素但后来失败了,这部分属实。
read_from_config()文件将WebElement对象存储到字典中,然后我循环遍历这些字典以便对每个元素执行操作。我第一次浏览字典是空的,从页面填充了WebElements,然后循环浏览并填写表单等。然后页面将重新加载,刷新页面中的元素将添加到字典中。但是,旧元素仍在那里,因此循环的开始将尝试从旧页面访问WebElements,而不再存在。
在每个循环结束时清除字典解决了这个问题。