Почему метод click селена возвращает NoSuchElementException? - PullRequest
0 голосов
/ 26 апреля 2018

Во время очистки базового веб-сайта javascript ( ссылка ) я придерживался функции щелчка, которая не дает желаемого результата. Я вставил код, который должен возвращать данные в раскрывающемся меню «Подходит для следующих автомобилей», но неожиданно он просто печатает сообщение оператора кроме. Я могу собрать все остальные данные из того же кода. Должен ли я добавить еще несколько строк, чтобы скрыть данные в раскрывающемся списке, если да, то какие строки добавить.

def product(self,response):
    while True:
        try:
            drop=self.driver.find_element_by_xpath('//*[@id="toggleMakeModelArrow"]')
            self.logger.info('Sleep for 3 sec.')
            sleep(3)
            drop.click()
            sel=Selector(text=self.driver.page_source)
            drop_down=sel.xpath('//*[@id="CachedItemDispaly_make_model_div"]/select/option/text()').extract()
            for i in range(len(drop_down)):
                print drop_down[i]+"||"

        except NoSuchElementException:
            self.logger.info('No more Fits the following cars to load..')
            break

1 Ответ

0 голосов
/ 28 апреля 2018

Причина, по которой вы продолжаете получать NoSuchElementException, заключается в том, что раскрывающийся список динамически вставляется в дерево DOM, поэтому вам нужно подождать некоторое время, пока оно не станет доступным. Лучший способ реализовать тайм-аут ожидания - использовать API ожидания , предоставляемый python-selenium.

Вот рабочий код, где time.sleep используется как временное решение.

from selenium.webdriver.support.ui import Select
from selenium import webdriver
import time


driver = webdriver.Chrome()
driver.get("https://portal.orio.com/webapp/wcs/stores/servlet/ProductDisplay?urlRequestType=Base&productId=218044&catalogId=10051&categoryId=146003&errorViewName=ProductDisplayErrorView&urlLangId=-150&langId=-150&top_category=146001&parent_category_rn=146001&storeId=11901")

drop=driver.find_element_by_xpath('//*[@id="toggleMakeModelArrow"]')

time.sleep(5)
drop.click()
time.sleep(5)
select = Select(driver.find_element_by_class_name('orioVehicleMakeModeltypeInfo'))

for select_option in select.options:
    print(select_option.text)
...