Судя по коду фронта, этот сайт работает на
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
, то на него необходимо явно переключиться, селекторы через эту границу работать не будут.