Можете ли вы использовать форматированные строки для поиска элементов по любой категории (xpath, css и т.д.) В selenium для Python?

#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 утра по ближневосточному часовому поясу 🤣