Я пытаюсь получить элементы на странице, которая имеет функцию прокрутки вниз ajax-load alla Twitter. По некоторым причинам это не работает должным образом. Я добавил несколько операторов print для его отладки, и я всегда получаю одинаковое количество элементов, а затем функция возвращается. Что я здесь не так делаю?

wd = webdriver.Firefox()
wd.implicitly_wait(3)

def get_items(items):
    print len(items)
    wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # len(items) and len(wd.find_elements-by...()) both always seem to return the same number
    # if I were to start the loop with while True: it would work, but of course... never end
    while len(wd.find_elements_by_class_name('stream-item')) > len(items):
        items = wd.find_elements_by_class_name('stream-item')
        print items
        wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    return items

def test():
    get_page('http://twitter.com/')
    get_items(wd.find_elements_by_class_name('stream-item'))
4
la_f0ka 29 Янв 2013 в 17:02

2 ответа

Лучший ответ

Попробуй поспать между

wd = webdriver.Firefox()
wd.implicitly_wait(3)

def get_items(items):
    print len(items)
    wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # len(items) and len(wd.find_elements-by...()) both always seem to return the same number
    # if I were to start the loop with while True: it would work, but of course... never end

    sleep(5) #seconds
    while len(wd.find_elements_by_class_name('stream-item')) > len(items):
        items = wd.find_elements_by_class_name('stream-item')
        print items
        wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    return items

def test():
    get_page('http://twitter.com/')
    get_items(wd.find_elements_by_class_name('stream-item'))

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

4
Amey 17 Сен 2015 в 20:12

Условие в цикле while было проблемой для моего варианта использования. Это был бесконечный цикл. Я исправил проблему с помощью счетчика:

def get_items(items):

    item_nb = [0, 1] # initializing a counter of number of items found in page

    while(item_nb[-1] > item_nb[-2]):   # exiting the loop when no more new items can be found in the page

        items = wd.find_elements_by_class_name('stream-item')
        time.sleep(5)
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        item_nb.append(len(items))

    return items

` ` `

0
nicolas.f.g 21 Окт 2017 в 11:29