#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. вы должны создать диск только один раз — перед циклом. Я не добавлял его раньше, но теперь он в коде.