Задать вопрос
@ArtiomK

Как залогинится на сайт с помощью Python Selenium, сайт каждый раз меняет id, name, xpath, selector?

Я сейчас пытаюсь с помощью selenium хотя бы зайти на сайт https://video.mosreg.ru/admin/#no-back-button , там динамически меняется xpath, selector, name, id, можно как-то зайти в этом случае? Устроился на первую работу программистом, оказалось, что я тут единственный программист, спросить не у кого, приходится мучать форумы. Вход на сайт с помощью Selenium - только первый этап, далее нужно будет выгружать данные внутренних страниц. =(

import os
from selenium import webdriver
driver_path = os.path.join("C:\\", "Users", "kozyrev.av", "Desktop", "chromedriver_win32", "chromedriver.exe")
options = webdriver.ChromeOptions()
options.add_argument('window-size=2028x900')
browser = webdriver.Chrome(executable_path=driver_path, options=options)
browser.get("https://video.mosreg.ru/admin/#no-back-button")

# поиск по id
browser.find_element_by_id("oknzyun").send_keys("123")  # input поле логина
browser.find_element_by_id("oknzyus").send_keys("123")  # input поле пароля
browser.find_element_by_id("oknzyv4").click()
  • Вопрос задан
  • 2731 просмотр
Подписаться 1 Средний 13 комментариев
Решения вопроса 1
kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn
Я вам ответил, зачем вы новый вопрос создаёте-то?

ArtiomK, хоть-бы про xpath прочитали. Вы привязываетесь к id, а они меняются каждый раз, xpath динамично меняться не может. В вашем случае нужен именно xpath. К примеру:
xpath формы логина:
//*[@class="Wt-domRoot"]/div[2]/div/div/div/div/div[3]/div/div[2]/div/input[1]


xpath формы пароля:
//*[@class="Wt-domRoot"]/div[2]/div/div/div/div/div[3]/div/div[2]/div/input[2]


Кнопка на данной странице всего одна, ко-этому xpath можно привязать по атрибуту type button:
//*[@type="button"]


Тут про xpath очень подробно и с примерами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
EreminD
@EreminD
Кое-что умею
смотрите
на странице всего 4 элемента input. Из них два с классом "line-height-wide"

driver.find_elements_by_css_selector('input.line-height-wide') //вернет вам два элемента.

Первый - имя
Второй - пароль

Кнопка вообще одна на всей странице
driver.find_element_by_css_selector('button').click()
Ответ написан
Комментировать
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Судя по коду фронта, этот сайт работает на Wt, а потому сам занимается маппингом id/name для элементов формы, прегенерируя их на бэкенде. Вам необходимо искать по классам, по такому принципу:
//div[contains(@class, 'loginWindow')]//input[contains(@class, 'line-height-wide')][1]

Обратите внимание, что используется предикатная функция contains, т.е. ищет подстроку и могут появиться лишние совпадения, вроде loginWindow__title. Есть еще функции starts-with и ends-with и остальные, не менее полезные штуки. Гуглите в сторону XPath. Два слэша означает: "где-то среди детей на любой глубине"

Я напишу на C#, вы адаптируйте под свой питон:

const string loginFormPath = "//div[contains(@class, 'loginWindow')]";
const string inputFieldSelector = "input[contains(@class, 'line-height-wide')]";

const string nameFieldPath = loginFormPath + "//" + inputFieldSelector + "[1]";
const string passwordFieldPath = loginFormPath + "//" + inputFieldSelector + "[2]";


Либо аналогичное с CSS-селекторами
const string loginFormPath = ".loginWindow";
const string inputFieldSelector = "input.line-height-wide";

const string nameFieldPath = loginFormPath + " " + inputFieldSelector + ":nth-child(1)";
const string passwordFieldPath = loginFormPath + " " + inputFieldSelector + ":nth-child(2)";


ЗЫ Самая популярная новичковая проблема: если когда-нибудь в процессе работы встретите iframe, то на него необходимо явно переключиться, селекторы через эту границу работать не будут.
Ответ написан
Комментировать
@Andrey_Dolg
Добавлю вы можете отталкиваться не от class/id, а от слов и типов элементов это немного сложнее воспринять, но и очень сложно с точки зрения изменения на сайте. Ну и как вам и сказали читайте xPath(куда проще) штука крайне хорошая и если осилите(понимаю что может казаться сложным) упростите себе жизнь на порядок.
Ответ написан
Toximiner
@Toximiner
Возможно, я чуть опоздал с советом. Но поиск полей, для ввода логина и пароля, гораздо проще:
login — //input[@type="text"]
password — //input[@type="password"]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы