Селен не может найти элемент, несмотря на добавление time.sleep()

#python #html #python-3.x #selenium #web-scraping

Вопрос:

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

 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"button[data-bind="click:selectLocation"]"}
 

Я попытался добавить time.sleep (), просто чтобы убедиться, что я достаточно долго жду загрузки страницы, но нет, ошибка все равно появляется. Вот html-код кнопки:

 <div class="form-group">                    
 <div class="col-xs-12">                       
   <label data-bind="lang:searchSelectLocation">Select a location</label>                        
  <button type="button" class="btn btn-default btn-block text-left" data-bind="click:selectLocation">                            <i class="fa fa-fw fa-map-marker-alt" data-bind="css:loadingLocation ? 'fa-spinner fa-spin' : 'fa-map-marker-alt'"></i>amp;nbsp;<!--ko text: location ? location.name : $root.lang('searchSelectLocationOptions') -->Cityname<!--/ko--><i class="fa fa-chevron-right pull-right"></i>                        
  </button>                  
 </div>               
</div> 

А вот фрагмент кода, который нужно найти и нажать на кнопку:

 time.sleep(20)
driver.find_element_by_css_selector('button[data-bind="click:selectLocation"]').click()
time.sleep(20)
 

P. S Я тоже уже подождал, прежде чем нажать. Извини, что пропустил это.

Комментарии:

1. Вам нужно поспать, прежде чем искать его. время.сон() , затем драйвер.найти()

2. Как уже предлагалось, поставьте любое ожидание, прежде чем нажимать. 200 секунд-это слишком большой тайм-аут

3. У меня тоже есть время.поспать() до этого. Не помогает.

4. @DanMullin Есть еще какие-нибудь предложения?

5. @Jandeer7 Я искал. Я пользуюсь этим . Чистая версия Selenium и успешно использовали функцию «дождаться загрузки». Это в python Selenium? Я вижу, что это основано на ответе. Хммм..

Ответ №1:

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

Во-вторых, Selenium поставляется с так называемыми явными ожиданиями, которые позволяют вам ждать, пока элемент не станет видимым или доступным для клика.

Так что в вашем случае это выглядело бы так:

 max_time_to_wait = 200 # if it doesn't find the element in this timespan, it will throw a TimeoutException
element = WebDriverWait(driver, max_time_to_wait).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-bind="click:selectLocation"]')))
element.click()
 

Комментарии:

1. Уже было ожидание, прежде чем нажать, но заменено вашим предложением, но все равно появилось исключение после 200 тайм-аута. Очень странно

2. Если вы используете Google Chrome, нажмите Ctrl Shift I, чтобы просмотреть веб-страницу, и после нажатия кнопки Crtl F вы можете ввести свой css-селектор. Кнопка должна быть выделена зеленым цветом, если селектор установлен правильно.

3. Да, я сделал это, и кнопка там и выделена, как и ожидалось. Вот почему это действительно странно

4. Ладно, это действительно очень странно. Это также может быть внутри iframe. Можете ли вы отправить ссылку на веб-сайт?

5. Конечно, мы можем поговорить в чате напрямую? Спасибо