#python #html #css #python-3.x #selenium
Вопрос:
Я только что понял это, и это немного страшно, потому что моя программа вращается вокруг поиска элементов с помощью селектора CSS с использованием форматированных строк.
Возьмем, к примеру, это:
stop_iteration_for_foh = driver.find_element_by_css_selector(f'.subheader-row:nth-child({the_counter}) .subheader-title-container')
Просто простой счетчик в цикле for, который каждый раз увеличивается на 1, и я получаю эту ошибку…
line 81, in actually_create_schedule
stop_iteration_for_foh = driver.find_element_by_css_selector(f'.subheader-row:nth-child({the_counter}) .subheader-title-container')
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".subheader-row:nth-child(3) .subheader-title-container"}
Теперь мне интересно, принимает ли селен это, из-за того, как отображается ошибка «строка 81 в…». Какая-нибудь помощь?
Комментарии:
1. Я вижу это в трассировке стека ошибок
.subheader-row:nth-child(3) .subheader-title-container
, он имеет 3 в числовом формате. Какова начальная стоимостьthe_counter
?2. Привет @cruisepandey, счетчик действительно начинается с 3. Я этого не понимал, и это в основном отвечает на вопрос о том, работают ли форматированные строки с селекторами. Теперь я задаюсь вопросом, что бы это могло быть!
Ответ №1:
Вы используете
subheader-row:nth-child({the_counter})
с первоначальной стоимостью как 3
и в errorStackTrace его заменяют вот так :
.subheader-row:nth-child(3)
В принципе, вы можете передать любое значение счетчика в xpath или css, более важно, чтобы это был действительный локатор.
Перейдите в Chrome — > Dev тоже (F12), а затем в раздел «Элементы», а затем нажмите CTRL F, а затем вставьте>
.subheader-row:nth-child(3) .subheader-title-container
, чтобы увидеть, есть ли какая-либо выделенная запись, если она есть, то вы должны быть готовы продолжить.
Ответ №2:
Вы определенно можете передавать параметры своим локаторам.
например, ваш локатор таков .subheader-row:nth-child({the_counter}) .subheader-title-container
, что вы можете сделать что-то вроде этого:
element_locator = '.subheader-row:nth-child({0}) .subheader-title-container'
for i in range (1,10):
element_locator.format(i)
stop_iteration_for_foh = driver.find_element_by_css_selector(element_locator)
Комментарии:
1. отличный ответ, как всегда. Иногда я задаюсь вопросом, когда ты спишь 🙂
2. Обычно я сплю где-то между 1 и 8 утра по ближневосточному часовому поясу 🤣