首页 > 解决方案 > 迭代文本文件,如何在循环中继续下一行?

问题描述

我是 python 新手,我在让我的脚本做我需要的事情时遇到了一些困难,我需要一些帮助。我的代码可能也可以更好地排序,如果它很乱,我很抱歉。整个脚本只是自动执行手动任务。步骤如下:

  1. 打开带有两个选项卡的浏览器
  2. 登录两个网站,每个标签中一个
  3. 读取并复制文本文件 test.txt 中的第一行,其中包含一封电子邮件
  4. 将第一行的值粘贴到 pages1 上的文本字段并按 RETURN
  5. 使用 selenium 在网页上获取一些数据1
  6. 它将值粘贴到网页 2 上并在网页 2 上发送短信 7. 复制网页 2 的输出
  7. 打开第三个 URL,并粘贴来自 pages2 的输出
  8. 从第 3 步开始重复(?)

目前这一切都很有效,但是当整个脚本完成后,我希望它返回到第 3 步,但这次读取文本文件中的第 2 行。在阅读第 3 行之前再次执行步骤 3-8,依此类推。我该怎么做?

我的想法是我有一个 .txt 文件,其中包含许多电子邮件地址,每行一个,我的脚本在每个地址上都经过这个过程。如果可能的话,我还希望脚本在阅读后将“-成功”附加到每一行。因此脚本将运行 x 次,具体取决于 test.txt 中有多少行。如果可能的话,最好也进行一些错误处理,即如果有任何错误,请移至文件中的下一行。

这是我的完整代码,我必须删除 URL 和一些敏感值,我希望它可以理解。我遇到问题的部分在下面突出显示:

    # coding=UTF-8
import clipboard
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException


def login():
    ## Define logins for#
    usernameB = ''
    passwordB = ''
    userMaestro = ''
    passMaestro = ''

    driver.switch_to_window(driver.window_handles[0])
    driver.get(first_url)
## Perform login in B ##
    username = driver.find_element_by_id('ctl00_logincontent_username_f')
    username.send_keys(usernameB)
    password = driver.find_element_by_id('ctl00_logincontent_password_f')
    password.send_keys(passwordB)
    loginButton = driver.find_element_by_id('ctl00_logincontent_submit')
    loginButton.click()  ##

    driver.switch_to_window(driver.window_handles[1])
    driver.get(second_url)

#### Perform login in Maestro
    usernameM = driver.find_element_by_name('username')
    usernameM.send_keys(userMaestro)
    passwordM = driver.find_element_by_name('password')
    passwordM.send_keys(passMaestro)
    loginMaestro = driver.find_element_by_name('submit')
    loginMaestro.click()


def searchB():

    driver.switch_to_window(driver.window_handles[0]) # Use first tab
    ## Search function ##
    emailSearch = driver.find_element_by_id('quicksearchinput')
    with open('C:\\Users\\user\\test.txt','r') as f:
            for email in f:
                emailSearch.send_keys(email, Keys.RETURN)
                sendSMS()


def sendSMS():
    try:
        kundenummer = driver.find_elements_by_tag_name('dd')[2].text # Grabs value from instersting tag.
        telefon = driver.find_elements_by_tag_name('dd')[4].text # Grabs value from interesting tag.
    except NoSuchElementException as exception:
        print "Element not found. Getting next email"
        searchBrikks()
    mailerText = "He"

    ## SEND SMS ##
    driver.switch_to_window(driver.window_handles[1])
    driver.get(second_url)
    driver.find_element_by_name('til').send_keys(telefon)
    driver.find_element_by_id('msgtxt').send_keys(mailerText)
    driver.find_element_by_xpath('//input[@value="Send SMS"]').click() ## We use this to send the SMS once done.
    smsRef = driver.find_elements_by_tag_name('strong')[1].text # Copies the output SMS-Ref.
    print('Successfully sent SMS and copied the referance number for log. ')
    addnoteBrikks()


def addnoteBrikks():

    smsRef = driver.find_elements_by_tag_name('strong')[1].text # Copies the output SMS-Ref.
    driver.switch_to_window(driver.window_handles[0]) # Goes to B
    kundenummer = driver.find_elements_by_tag_name('dd')[2].text # Grabs ID for URL
    telefon = driver.find_elements_by_tag_name('dd')[4].text # Grabs value from interesting tag.

    driver.get(third_url+kundenummer) # Goes to "add note" on customer in B
    fullDraft = 'SMS sendt til:'+ telefon + '. Kundenummer oppgitt: ' +kundenummer + '\n' + smsRef
    shortDraft = 'Mailer-daemon, SMS Sendt. Ref:' +str(smsRef) #For subject in Brikks. Add SMS-ref?

    emneBrikks = driver.find_element_by_id('ctl00_maincontent_uiSubject_f')
    emneBrikks.send_keys(shortDraft)
    bodyBrikks = driver.find_element_by_id('ctl00_maincontent_uiBody_f')
    bodyBrikks.send_keys(fullDraft)

    createTicket = driver.find_element_by_id('ctl00_maincontent_save')
    createTicket.click() #Create the ticket in Brikks
    searchB()


first_url = "https://"
second_url = "http://"
third_url = "https:"

driver = webdriver.Chrome(executable_path=r"chromedriver.exe")
driver.execute_script('window.open("{}");'.format(''))


def main():
    login()
    searchB()
    driver.switch_to_window(driver.window_handles[1])
    smsRef = driver.find_elements_by_tag_name('strong')[1].text # Copies the output SMS-Ref.


if __name__ == '__main__':
    main()

我怎么能在这里实现我想要的?感谢任何帮助!

编辑:

所以我感兴趣的部分是:

 def searchBrikks():

    driver.switch_to_window(driver.window_handles[0]) # Use first tab
    ## Search function ##
    emailSearch = driver.find_element_by_id('quicksearchinput')
    with open('C:\\Users\\user\\test.txt','r') as f:
            for email in f:
                emailSearch.send_keys(email, Keys.RETURN)
                sendSMS()
                ### What to write further here? ###

下次调用 searchB() 时,如何使它读取第 2 行?

标签: python

解决方案


我通过将循环移动到主函数来解决这个问题,如下所示:

def main():

    driver.execute_script('window.open("{}");'.format(''))
    login()

    driver.switch_to_window(driver.window_handles[0]) # Use first tab
    emailSearch = driver.find_element_by_id('quicksearchinput') # Identify Quicksearch text-field
    with open('C:\\Users\\user\\test.txt','r+') as f:
        for email in f:
            searchB(email) ## <-- Added this
            print(email)

使用我的 searchB() 函数如下:

def searchB(mail):  ## <-- Added this
    driver.switch_to_window(driver.window_handles[0]) # Use first tab
    emailSearch = driver.find_element_by_id('quicksearchinput') # Identify Quicksearch text-field
    emailSearch.send_keys(email, Keys.RETURN)
    sendSMS()

推荐阅读