我正在学习 python Selenium,我创建了一个“电子邮件”列表:“密码”。我需要在正确的位置插入这些电子邮件,然后是密码,然后是登录按钮。这是代码:
f = open('users.txt','r')
for line in f.readlines():
print(line)
mail = line[0:line.index(':')]
line = line[line.index(':')+1:]
password = line
email_input = driver.find_element_by_xpath('//*[@id="email"]')
email_input.click()
email_input.send_keys(mail)
password_input = driver.find_element_by_xpath('//*[@id="password"]')
password_input.click()
password_input.send_keys(password)
lgn_btn = driver.find_element_by_css_selector('#sign-in')
lgn_btn.click()
n_url = driver.current_url
time.sleep(5)
driver.refresh()
我得到的错误是:
<块引用>mail = line[0:line.index(':')]
值错误:未找到子字符串
txt 文件是:
g_santeusanio@arcor.de:sportpark13
mrtslabbert@absamail.co.za:oohethooq12313w
lauriecd@absamail.co.za:christcorem
答案 0 :(得分:1)
你应该使用
line.find(':')
而不是line.index(':')
这是因为 index() 方法在 中搜索子字符串并返回它的索引。
既然要查找字符串中的单个字符,则应使用find()
方法!
用于两个代码的文本文件,演示:
根据@John Gordon 的评论进行编辑
当字符串中不存在这样的值时,index()
方法返回一个值错误。使用的文本文件有 2 个空行。 find()
方法返回 -1 而不是错误。
注意第一对邮件和密码是为问题中使用的代码块打印的
当它在第二行(为空)中搜索值时,它会引发 ValueError
。另一方面,如果您在使用 find()
方法时看到输出(下面附有 img),它只会打印出空字符串并继续前进!
因此,当您不确定要搜索的值是否在字符串中时,最好使用 find()
。
根据@Chris 的评论进行编辑
这是我使用的代码:
for line in f.readlines():
# print(line)
mail = line[0:line.find(':')]
password = line[line.find(':') + 1:]
print(mail)
print(password)
我收到的您粘贴的文本的输出是这样的:
答案 1 :(得分:0)
我认为在这种情况下 split()
更容易理解和使用。 split()
按提供的字符拆分字符串并返回包含结果的值数组。在这种情况下,我们可以用“:”分割并得到两个部分。
所以前几行变成
for line in f.readlines():
print(line)
data = line.split(':')
mail = data[0]
password = data[1]
...
这应该可以解决您提出的问题,但查看您的其余代码,还会出现其他问题,我有一些建议。
不要覆盖变量。
line = line[line.index(':')+1:]
它使您的代码更难以遵循,例如您在此处用另一个值覆盖了 line
。现在您无法再访问 line
的原始值,并且随着脚本变得越来越长,其他读者(包括您自己)将更难调试代码。取而代之的是给它一个新名称,以最好地表示变量将保存的内容。在本例中为 password
,正如您在下一行所做的那样。
line = line[line.index(':')+1:]
password = line
变成
password = line[line.index(':')+1:]
使用最简单的定位器形式,例如如果您通过 ID 定位元素,则使用 .find_element_by_id()
,而不是 XPath 或 CSS 选择器。这将使您的代码更易于阅读。
email_input = driver.find_element_by_xpath('//*[@id="email"]')
变成
email_input = driver.find_element_by_id('email')
您正在单击,然后将元素的键发送到同一元素。一般来说,这不是必需的,您可以省略点击。 (在某些情况下这是必要的,但根据我的经验,这种情况很少见)。
email_input = driver.find_element_by_id('email')
email_input.click()
email_input.send_keys(mail)
变成
email_input = driver.find_element_by_id('email')
email_input.send_keys(mail)
甚至
driver.find_element_by_id('email').send_keys(mail)
因为看起来您之后不使用 email_input
。
所以用上面的建议更新代码,它看起来像这样
for line in f.readlines():
print(line)
data = line.split(":")
email = data[0]
password = data[1]
driver.find_element_by_id('email').send_keys(email)
driver.find_element_by_id('password').send_keys(password)
driver.find_element_by_id('sign-in').click()
n_url = driver.current_url
time.sleep(5)
driver.refresh()