有什么问题吗?

时间:2020-12-30 13:56:46

标签: python selenium selenium-webdriver

我正在学习 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

2 个答案:

答案 0 :(得分:1)

你应该使用

line.find(':')

而不是line.index(':') 这是因为 index() 方法在 中搜索子字符串并返回它的索引。

既然要查找字符串中的单个字符,则应使用find() 方法!

用于两个代码的文本文件,演示:

enter image description here

根据@John Gordon 的评论进行编辑

当字符串中不存在这样的值时,index() 方法返回一个值错误。使用的文本文件有 2 个空行。 find() 方法返回 -1 而不是错误。

注意第一对邮件和密码是为问题中使用的代码块打印的

enter image description here

当它在第二行(为空)中搜索值时,它会引发 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)

我收到的您粘贴的文本的输出是这样的:

enter image description here

答案 1 :(得分:0)

我认为在这种情况下 split() 更容易理解和使用。 split() 按提供的字符拆分字符串并返回包含结果的值数组。在这种情况下,我们可以用“:”分割并得到两个部分。

所以前几行变成

for line in f.readlines():
    print(line)
    data = line.split(':')
    mail = data[0]
    password = data[1]
    ...

这应该可以解决您提出的问题,但查看您的其余代码,还会出现其他问题,我有一些建议。

  1. 不要覆盖变量。

    line = line[line.index(':')+1:]
    

    它使您的代码更难以遵循,例如您在此处用另一个值覆盖了 line。现在您无法再访问 line 的原始值,并且随着脚本变得越来越长,其他读者(包括您自己)将更难调试代码。取而代之的是给它一个新名称,以最好地表示变量将保存的内容。在本例中为 password,正如您在下一行所做的那样。

    line = line[line.index(':')+1:]
    password = line
    

    变成

    password = line[line.index(':')+1:]
    
  2. 使用最简单的定位器形式,例如如果您通过 ID 定位元素,则使用 .find_element_by_id(),而不是 XPath 或 CSS 选择器。这将使您的代码更易于阅读。

     email_input = driver.find_element_by_xpath('//*[@id="email"]')
    

    变成

     email_input = driver.find_element_by_id('email')
    
  3. 您正在单击,然后将元素的键发送到同一元素。一般来说,这不是必需的,您可以省略点击。 (在某些情况下这是必要的,但根据我的经验,这种情况很少见)。

     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()
相关问题