Принудительное селение приостановить и ждать, пока поле будет доступно

Ниже приведен фрагмент кода из моего сценария python, который читает файл excel и назначает ячейки в строке переменной, которая затем используется для ввода в поле в браузере. он отлично работает … по большей части. то, что я хотел бы сделать, это настроить какой-то цикл после того, как браузер загрузит страницу, чтобы сделать следующее:

найдите элемент по некоторому идентификатору. если это не удается, подождите 5 секунд, затем повторите попытку. если ему удастся продолжить работу с остальной частью скрипта. теперь мне легко, это моя первая реальная попытка. я попытался вложить try / except заявления, но это стало очень беспорядочным.

from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.keys import Keys import time import xlrd workbook = xlrd.open_workbook("my_excel_file.xlsx") worksheet = workbook.sheet_by_name('Sheet1') x = 0 for current_row in range(worksheet.nrows): try: cmt = worksheet.row(current_row)[2].value browser = webdriver.Firefox() # Get local session of firefox browser.get("http://www.somewebsite.com") # Load page time.sleep(5) #this timer is the issue, if the field takes 6 seconds to be ready, script fails comment = browser.find_element_by_id("slow_comment_box") # Find the comment box comment.send_keys(str(cmt) + Keys.RETURN) x += 1 except: print ("Error on " + str(x)) quit () 

есть ли способ заставить это вести себя так, как я сказал выше? Я знаю, что селен ждет загрузки страницы, но текстовое поле не является нормальным и, похоже, имеет собственное загрузочное, вращающееся колесо.

резюме и решение ответ ниже. у моих тупых вещей были некоторые синтаксические ошибки. эта страница была чрезвычайно полезна.

2 Solutions collect form web for “Принудительное селение приостановить и ждать, пока поле будет доступно”

Вы хотите использовать WebDriverWait

 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.Id, 'id'))) 

После попытки ответа Эрки М. я пошел сюда, чтобы узнать больше о ожидании в Селене:

http://selenium-python.readthedocs.org/en/latest/waits.html

В статье упоминается другая альтернатива, которая проста и проста:

 from selenium import webdriver browser = webdriver.Firefox() browser.implicitly_wait(30) browser.get("http://www.somewebsite.com") 

С того момента, когда вы укажете неявное время ожидания, браузер будет терпелив и опросить сайт, чтобы узнать, может ли он найти искомый элемент. Этот метод позволяет избежать необходимости в дополнительном импорте, а также необходимость указания того, какой элемент вы ожидаете раньше времени.

Одна вещь, которую я должен упомянуть, это то, что иногда я все еще возвращаюсь к time.sleep (1), например, после ввода ввода. Implicitly_wait даст время для появления элемента, но это не заставит команды ждать достаточно долго, чтобы пользовательский интерфейс был отзывчивым.

  • Значение Python xlrd Named Range
  • Python / Excel - IOError: Нет такого файла или каталога:
  • Как получить имена листов из файлов XLS без загрузки всего файла?
  • python xlutils: formatting_info = Истина еще не реализована
  • python xlrd неподдерживаемый формат или поврежденный файл.
  • python: создание книги excel и демпинг csv-файлов в виде рабочих листов
  • Шаблон Python Excel читает и переписывает, поддерживает формулы и форматирование
  • XLRD / Python: чтение файла Excel в dict с for-loop
  • Преобразование Python Float в String без потери точности
  • Как добавить новый столбец и строку в файл .xls с помощью xlrd
  • Поиск строки и получение значения строки и столбца
  • Python - лучший язык программирования в мире.