Я сделал сканер для этой страницы (http://www.bobaedream.co.kr/cyber/CyberCar.php?gubun=I), чтобы собрать список акций конкретных производителей. Процесс начинается с выбора выпадающего меню в первой строке верхней части меню поиска.Как подождать, пока в раскрывающемся меню выберите Selenium Python?
Каждого право выпадающего меню детское меню в левом раскрывающемся меню. Я хотел бы сделать это, чтобы выбрать каждый первый элемент в каждом раскрывающемся меню и нажать кнопку «Поиск» для первого запуска. После сканирования списка акций, я установил второй элемент последнего раскрывающегося меню и нажал кнопку «Поиск».
Но проблема здесь возникает. Я сохранил каждый элемент каждого раскрывающегося меню в виде кортежа. Когда я пытаюсь вызвать второй элемент последнего раскрывающегося меню для второго раунда обхода, возникает «StaleElementReferenceException» или «NoSuchElementException», когда сообщение «Элемент больше не привязан к DOM». Таким образом, я хотел бы, чтобы элемент подождал, пока не завершится весь раунд каждой итерации выпадающего списка.
Ниже приведен мой код, но все же есть сообщение об ошибке. Моя ошибка обычно возникает во втором цикле while. На данный момент, я предполагаю, что какой-то тип кода wait.until (EC. ~) Во второй функции «try» может справиться с этим, но у меня нет конкретной идеи для этого. Пожалуйста, помогите или дайте мне совет.
def option2_menu_loaded(inDriver):
path = '//select[@id="level2_no"]'
return inDriver.find_element_by_xpath(path)
self.wait.until(option2_menu_loaded)
while True:
try:
select_option2_values = [
('%s' % o.get_attribute('text'), '%s' % o.get_attribute('value'))
for o
in self.getNewSelect("#level2_no").options
if o.get_attribute('text') != '세부등급']
except (StaleElementReferenceException, NoSuchElementException):
print("Exception Found")
continue
break
for option2 in select_option2_values:
self.csv.setCarTitle(ma, mo, de, option1[0], option2[0])
print(option2[0], option2[1])
self.driver.implicitly_wait(0.5)
while True:
try:
self.getNewSelect("#level2_no").select_by_value(option2[1])
except (StaleElementReferenceException, NoSuchElementException):
self.getNewSelect("#level2_no").options
print("Exception Found")
continue
break
Спасибо за комментарий. Я попытался использовать код "driver.refresh()" + "driver.implicitly_wait (1)" в части исключения. Когда возникает первое исключение, он помогает выйти из части исключения во время цикла. Но, он снова застрял в цикле while после 3 ~ 4 побегов из исключения. Для третьего комментария я попробовал это в первый раз, когда я сделал этот код в начале, но он вернул ошибку кэширования. Есть ли у вас какие-либо идеи? –
Единственная идея, которая возникает из-за ошибки кэша при попытке найти элементы, вероятно, является вашим локатором xpath. Он должен быть общим и не специфичным для одного элемента. Например, НЕ это: // div [@ class = 'buy'] // div [@ class = 'cars'] // p [@ text = 'Honda'], но вместо этого // div [@ class = ' купить '] // DIV [@ класс =' автомобили] // р [@text]. Обратите внимание, как последний Xpath не является достаточно конкретным, поэтому он будет использовать все автомобили вместо автомобилей Honda. Так что, возможно, разместив здесь (обновите свой вопрос), может помочь немного HTML-код, окружающий ваш Xpath! –
Возможно, вы уже пробовали это, но, похоже, ваш сайт содержит фрейм.Если это так, вам нужно переключить фокусировку webDriver на соответствующие кадры, прежде чем пытаться найти элемент: 1) driver.SwitchTo(). Frame (Name) 2) driver.SwitchTo(). DefaultContent() 3) драйвер .FindElement (By.XPath (XpathLocator)); element.Click(); –