Как мой скрипт при использовании Selenium должен каждый раз выбирать следующую строку электронной почты из моего текстового файла для ввода формы рассылки?

#python #selenium #file #text

Вопрос:

Привет, в этот момент я испытываю трудности. Не мог бы кто-нибудь, пожалуйста, помочь мне! Я уже много раз пытался решить эту проблему. Это мой первый скрипт, и его задачей должен быть ввод электронных писем из текстового файла отдельно в рассылку.

  from selenium import webdriver import time

 driver = webdriver.Chrome()
 driver.get("https://www.zalando.pl/zalando-newsletter/")

 
 searchbox = driver.find_element_by_xpath('//*[@id="email-input"]')
 time.sleep(1)
 
 with open('EmailsNewsletter.txt') as f:
     myline = f.readline()
     while myline:
         searchbox.send_keys(myline)
         myline = f.readline()
         f.close()
 
 
 button1 =
 driver.find_element_by_xpath('/html/body/div[4]/div/div/div/div/div/div/div[2]/div/div/form/div/div/div[3]/div/div[1]/div/label')
 time.sleep(1) button1.click()
 
 button2 =
 driver.find_element_by_xpath('/html/body/div[8]/div[3]/div/div/div/div/div[2]/div[1]/button[1]')
 button2.click()
 
 button3 =
 driver.find_element_by_xpath('/html/body/div[4]/div/div/div/div/div/div/div[2]/div/div/form/div/div/div[5]/button')
 time.sleep(1) button3.click()
 
 time.sleep(2)

 button4 =
 driver.find_element_by_xpath('/html/body/div[4]/div/div/div/div/div/div/div[2]/div/div/div/div[2]/div[2]/span')
 time.sleep(1) button4.click()
 
 time.sleep(2) driver.quit()
 

Комментарии:

1. Я думаю, нам нужно увидеть вас EmailsNewsletter.txt , чтобы понять, что здесь происходит. Кроме того, не могли бы вы более конкретно рассказать о проблеме, с которой вы сталкиваетесь? Вы получаете какую-то ошибку или что-то работает не так, как вы ожидаете?

2. может быть, вам следует запустить код ВНУТРИ цикла for

3. шорете for line in f: ... code to send it ... — без while , readline() . И НЕ используйте close() , потому что вы закрываете файл после первой строки. Кроме того, вы должны with ... закрыть его автоматически.

4. вы должны проверить, имеют ли объекты уникальный идентификатор или другие значения, а затем вы можете использовать более короткий xpath — ie xpath('//button[@id="..."]')

5. я пробовал разные способы найти xpath, но я не мог найти другое имя для этих xpath @furas

Ответ №1:

Если вы хотите сделать что-то много раз, сделайте это ВНУТРИ цикла ( for или while ).

 with open('EmailsNewsletter.txt') as f:
    for line in f: 
        ... your code ...
 

Использование for -цикла вам не нужно while , readline() и код короче.

И не используйте close() внутренний цикл, потому что таким образом вы закрываете файл после первой строки, и он не может прочитать следующие строки. Кроме того, если вы используете with open() as f: , то вам это не нужно close() , потому что он автоматически закроется, когда вы уйдете with ...

Но я думаю, что вам нужно переместить весь код внутри цикла. Для каждой строки вам, возможно, придется снова загрузить страницу и выбрать ввод.

 from selenium import webdriver import time

# - before loop -

driver = webdriver.Chrome()

# - loop -

with open('EmailsNewsletter.txt') as f:


    for line in f: 

        driver.get("https://www.zalando.pl/zalando-newsletter/")

        searchbox = driver.find_element_by_xpath('//*[@id="email-input"]')
        time.sleep(1)
        searchbox.send_keys(myline)

        button1 = ...
        time.sleep(1) 
        button1.click()
 
        button2 = ...
        time.sleep(1) 
        button2.click()
 
        button3 = ...
        time.sleep(1) 
        button3.click()
 
        button4 = ...
        time.sleep(1) 
        button4.click()

 # - after loop -

 driver.quit()
 

Комментарии:

1. после завершения работы одного браузера и запуска второго первый браузер автоматически не закрывается. Как правило, весь сценарий работает очень быстро после ваших изменений.

2. я смог решить эту проблему самостоятельно.

3. вы должны создать диск только один раз — перед циклом. Я не добавлял его раньше, но теперь он в коде.