2017-02-02 10 views
0

Я сделал сканер для этой страницы (http://www.bobaedream.co.kr/cyber/CyberCar.php?gubun=I), чтобы собрать список акций конкретных производителей. Процесс начинается с выбора выпадающего меню в первой строке верхней части меню поиска.Как подождать, пока в раскрывающемся меню выберите Selenium Python?

enter image description here

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

Но проблема здесь возникает. Я сохранил каждый элемент каждого раскрывающегося меню в виде кортежа. Когда я пытаюсь вызвать второй элемент последнего раскрывающегося меню для второго раунда обхода, возникает «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 

ответ

1

Если вы Google на StaleElementException вы увидите решения, которые пытаются еще раз, чтобы найти элемент в цикле. Итак, , это одна идея, в вашем исключении выше попробуйте 3 раза с задержкой в ​​1 секунду перед каждой попыткой find_Element снова, посмотрите, поможет ли это.

Другая идея - обновить страницу (конечно, не идеально, но она может работать) между каждым обходом. Вы можете сделать это в Python с помощью:

driver.refresh() 

Наконец, вы можете также исключать бесконечный цикл (это может быть причиной StaleElementException) через все различные элементы при сканировании, как Селен имеет решение для этого. Вы можете сохранить eveything в кортеже/массиве без прокрутки каждой записи по с использованиемfind_ElementS вместо find_ElemenT. Попробуйте это, если это улучшит общую производительность:

a=[]; 
a = driver.find_elements_by_xpath(path) 

Удачи!

+0

Спасибо за комментарий. Я попытался использовать код "driver.refresh()" + "driver.implicitly_wait (1)" в части исключения. Когда возникает первое исключение, он помогает выйти из части исключения во время цикла. Но, он снова застрял в цикле while после 3 ~ 4 побегов из исключения. Для третьего комментария я попробовал это в первый раз, когда я сделал этот код в начале, но он вернул ошибку кэширования. Есть ли у вас какие-либо идеи? –

+0

Единственная идея, которая возникает из-за ошибки кэша при попытке найти элементы, вероятно, является вашим локатором xpath. Он должен быть общим и не специфичным для одного элемента. Например, НЕ это: // div [@ class = 'buy'] // div [@ class = 'cars'] // p [@ text = 'Honda'], но вместо этого // div [@ class = ' купить '] // DIV [@ класс =' автомобили] // р [@text]. Обратите внимание, как последний Xpath не является достаточно конкретным, поэтому он будет использовать все автомобили вместо автомобилей Honda. Так что, возможно, разместив здесь (обновите свой вопрос), может помочь немного HTML-код, окружающий ваш Xpath! –

+0

Возможно, вы уже пробовали это, но, похоже, ваш сайт содержит фрейм.Если это так, вам нужно переключить фокусировку webDriver на соответствующие кадры, прежде чем пытаться найти элемент: 1) driver.SwitchTo(). Frame (Name) 2) driver.SwitchTo(). DefaultContent() 3) драйвер .FindElement (By.XPath (XpathLocator)); element.Click(); –

 Смежные вопросы

  • Нет связанных вопросов^_^