Как заставить цикл списка работать в селеновом питоне?

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

from selenium import webdriver

PATH = "C:\Program Files (x86)\chromedriver.exe"
webdriver = webdriver.Chrome(PATH)

webdriver.get("https://examplewebsite.com/login/index.php")


password = webdriver.find_element_by_id("password")
password.send_keys("Helloworld1@")

username = webdriver.find_element_by_id("username")
usernamefile = open("list.txt", "r")


for i in usernamefile:
        username.send_keys(i)
        submit = webdriver.find_element_by_id("loginbtn")
        submit.submit()

Обновлено: это ошибка, которую показывает python. Я не знаю, как это исправить.

File "C:\Users\Ranjhaaa\Desktop\test.py", line 23, in <module>
    username.send_keys(i)
  File "C:\Users\Ranjhaaa\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webelement.py", line 477, in send_keys
    self._execute(Command.SEND_KEYS_TO_ELEMENT,
  File "C:\Users\Ranjhaaa\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\Ranjhaaa\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Ranjhaaa\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=87.0.4280.88)

стек сохраняет ссылку на элементы на текущей странице, и когда вы нажимаете кнопку submit, он загружает новую страницу, и все ссылки теряются - и это дает ваше сообщение об ошибке. После каждой перезагрузки вам придется снова использовать find_element_by_id, чтобы получить доступ к полю password и username - так что вам придется делать это внутри for i in usernamefile:

furas 15.12.2020 06:11

@furas, не могли бы вы показать эти дополнения в исходном коде? На самом деле, будучи новичком в кодировании, я немного запутался в том, как и где внести эти полезные изменения, предложенные вами. Спасибо

mhkorai 15.12.2020 06:17

Я добавил это как ответ ниже

furas 15.12.2020 06:18

так что вы можете пометить мой ответ как принятый, а позже вы можете проголосовать за него.

furas 15.12.2020 06:26

@furas Ваш ответ помечен как принятый, и вскоре за него проголосуют

mhkorai 15.12.2020 06:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
58
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Я новичок в кодировании. Не могли бы вы проиллюстрировать свое предложение, внеся исправления в код? Спасибо

mhkorai 15.12.2020 05:58
Ответ принят как подходящий

selenium сохраняет ваш объект password и username как ссылку на элементы на текущей странице, и когда вы нажимаете кнопку submit, он загружает новую страницу, и все ссылки теряются - и это дает ваше сообщение об ошибке "element is not attached to the page document".

После каждой перезагрузки страницы вам нужно снова использовать find_element_by_id, чтобы получить доступ к полям password и username - так что вам придется делать это внутри for-цикла

usernamefile = open("list.txt", "r")

for i in usernamefile:
    password = webdriver.find_element_by_id("password")
    password.send_keys("Helloworld1@")

    username = webdriver.find_element_by_id("username")
    username.send_keys(i)

    submit = webdriver.find_element_by_id("loginbtn")
    submit.submit()
from selenium import webdriver

PATH = "C:\Program Files (x86)\chromedriver.exe"

usernamefile = open("list.txt", "r")


for i in usernamefile:
     webdriver = webdriver.Chrome(PATH)

     webdriver.get("https://examplewebsite.com/login/index.php")

     username = webdriver.find_element_by_id("username")

     password = webdriver.find_element_by_id("password")
     password.send_keys("Helloworld1@")
   
     username.send_keys(i)
     submit = webdriver.find_element_by_id("loginbtn")
     submit.submit()
     driver.quit()

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

из веб-драйвера импорта селена

file_path = "ваш путь к исполняемому файлу для chromedriver"

Имена пользователей = открыть ("list.txt", "r")

для я в именах пользователей: браузер = webdriver.Chrome(file_path)

 browser.get("https://examplewebsite.com/login/index.php")

 username = webdriver.find_element_by_id("username")
 username.send_keys(i)
 password = webdriver.find_element_by_id("password")
 password.send_keys("Helloworld1@")

 
 submit = webdriver.find_element_by_id("loginbtn")
 submit.submit() 
 # then close the driver and start again the loop
 browser.close()
 # also you can use the refresh function

Другие вопросы по теме