Отладка selenium webdriver и может просматривать элементы, как ожидалось, в отладчике, но при запросе в моем скрипте они отображаются пустыми

#python #selenium #selenium-webdriver #web-scraping #pycharm

#python #selenium #selenium-webdriver #очистка веб-страниц #pycharm

Вопрос:

Я пытаюсь автоматизировать некоторую очистку веб-страниц и собрал скрипт python с использованием selenium webdriver. Я успешно реализовал неявные и явные ожидания ранее в скрипте.

Во время отладки в PyCharm я могу видеть все атрибуты / значения каждого объекта thumbnail (WebElement), как и ожидалось, включая текст. Но тогда текстовое поле пусто БОЛЬШУЮ часть времени, когда я пытаюсь получить к нему доступ в скрипте. Я перепробовал все виды условий ожидания в классе EC.

     try:
        # wait 30 seconds before looking for element
        WebDriverWait(driver, 30).until(
            EC.presence_of_all_elements_located((By.CLASS_NAME, 'thumbnail'))
        )
    except:
        # else quit
        driver.quit()
        quit(1)

thumbnails = driver.find_elements_by_class_name('thumbnail')
for thumbnail in thumbnails:
    try:
        # wait 30 seconds before looking for element
        WebDriverWait(driver, 30).until(len(thumbnail.text) != 0)
    except:
        # else quit
        driver.quit()
        quit(1)
    time = thumbnail.text
    h, m = time.strip().split(':')
    url = thumbnail.find_element_by_tag_name('img').get_attribute('src')
    urllib.request.urlretrieve(url, 'slides/'   h   '_'   m   '.jpg')
  

Поскольку иногда я получаю ожидаемое поведение в скрипте, я должен предположить, что здесь происходит какое-то странное состояние гонки каждый раз, когда я запрашиваю что-либо. Я просто не знаю, что это может быть. Моя следующая мысль — захватить HTML в виде строки через driver.pagesource и использовать LXML для его анализа, но, очевидно, это обходной путь.

Почему я всегда могу видеть значения в моем отладчике и как такое поведение может быть возможным? Кроме того, в последней попытке / except предложение except выполняется задолго до 30 секунд…

Редактировать: я прикрепил соответствующий HTML

 <!-- Thumbnail template -->
                    <script id="thumbnailTemplate" type="text/template">
                        <@ _.each(thumbnails, function (thumbnail) { @>
                            <li id="<@= thumbnail.id @>"
                                class="thumbnail"
                                tabindex="0"
                                role="button"
                                aria-label="<@= Panopto.GlobalResources.Viewer_Aria_JumpToTimestamp.format(thumbnail.timestamp)@>"
                                style="display:none;">
                                <div class="thumbnail-highlight accent-background safety-accent-border"
                                    aria-label="Jump to {0}"></div>
                                <img data-src="<@= thumbnail.src @>" aria-hidden="true" />
                                <div class="thumbnail-timestamp"
                                    aria-label="<@= thumbnail.text ? thumbnail.text : Panopto.GlobalResources.Viewer_Aria_HideThumbnailTimeFormat.format(thumbnail.timestamp)@>"
                                    ><@= thumbnail.timestamp @></div>
                                <@ if (thumbnail.editable) { @>
                                    <div class="thumbnail-buttons" style="display:none;">
                                        <i class="thumbnail-edit material-icons" tabindex="0" title="Edit">amp;#xE150;</i><!-- whitespace
                                     --><i class="thumbnail-delete material-icons" tabindex="0" title="Delete">amp;#xE872;</i>
                                    </div>
                                <@ } @>
                            </li>
                        <@ }); @>
                    </script>

                    <ol id="thumbnailList" class="thumbnail-strip" aria-label="Preview image list" style="width: 480px;">
                        
                            <li id="thumbnail9thumbnailList" class="thumbnail highlighted" tabindex="0" role="button" aria-label="Jump to 0:00" style="display: none;" aria-current="true">
                                <div class="thumbnail-highlight accent-background safety-accent-border" aria-label="Jump to {0}"></div>
                                <img data-src="https://pitt.hosted.panopto.com/Panopto/Pages/Viewer/Thumb.aspx?eventTargetPID=db184992-2dd3-4257-aa24-ac10003dcc84amp;amp;sessionPID=70dd3b7a-2b76-40ce-98ea-ac10003dccf6amp;amp;number=20774958amp;amp;isPrimary=falseamp;amp;absoluteTime=13241245519.395262" aria-hidden="true" src="https://pitt.hosted.panopto.com/Panopto/Pages/Viewer/Thumb.aspx?eventTargetPID=db184992-2dd3-4257-aa24-ac10003dcc84amp;amp;sessionPID=70dd3b7a-2b76-40ce-98ea-ac10003dccf6amp;amp;number=20774958amp;amp;isPrimary=falseamp;amp;absoluteTime=13241245519.395262">
                                <div class="thumbnail-timestamp" aria-label="Preview image at 0:00">0:00</div>
                                
                            </li>
  

Комментарии:

1. Я не могу предоставить точное решение, поскольку вы не предоставили общий доступ к HTML DOM или ссылке на страницу. Однако есть пара предложений, например, на вашей странице динамически загружается javascript, например, как только вы куда-то перемещаете курсор, тогда загружается только текст страницы. Также ваш комментарий немного отличается от явного wit в первой строке. Он не будет ждать 30 секунд, прежде чем начать поиск элементов, а не будет искать до 30 секунд, чтобы элементы появились. Возможно, ваш элемент находится, но текст не отображается полностью. Пожалуйста, поделитесь ссылкой на страницу / HTML для дополнительной отладки.

2. @rahulrai спасибо за ваш ответ, я добавил соответствующий HTML … как вы можете видеть, что определенно задействованы некоторые сценарии, но почему cant / как webdriver может извлекать непосредственно из источника страницы? (Я после временных меток)

3. Тем не менее, я не могу полностью воспроизвести / понять вашу проблему. Но я вижу элемент с миниатюрой i внутри тега script. Поэтому для получения текста вы должны использовать thumbnail.get_attribute («innerHTML») , а не thumbnail.text.