Как выполнить селеновую автоматизацию веб-страницы автоматического обновления (каждые 5 секунд)? - PullRequest
0 голосов
/ 18 февраля 2019

Я автоматизирую веб-страницу, состоящую из очень большой таблицы (более 300 строк), используя Chrome.Содержимое таблицы обновляется каждые 5 секунд.Прежде чем селен завершает обход всех строк, таблица обновляется.Например, если селен прошел 50 строк, а затем таблица обновилась, 51-я строка создает исключение StaleElementReferenceException.Я не знаю, какие возможности нужно изменить для получения контента.

Я попытался отключить JavaScript и запустить скрипт автоматизации.Однако отключение javascript привело к проблемам с драйвером chrome.

def table_get():
    header_list = list()
    return_list = list()

    head = driver.find_elements_by_tag_name('thead')
    body = driver.find_elements_by_tag_name('tbody')

    for row in head.find_elements_by_tag_name('tr'):
        for header in row.find_elements_by_tag_name('th'):
            header_list.append(th.text)

    for row in body.find_elements_by_tag_name('tr'):
        temp_list = list()
        for cell in row.find_elements_by_tag_name('td'):
            temp_list.append(cell.text)
        return_list.append(zip(header_list, temp_list))

    return return_list

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

Фактический вывод: обход невозможен.StaleElementReferenceException, брошенный между обходами.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Используйте Javascript для получения данных, как в примере ниже, здесь , здесь и здесь

headers = driver.execute_script('return [...document.querySelectorAll("thead tr th")].map(e=>e.textContent)')
cells = driver.execute_script('return [...document.querySelectorAll("tbody tr td")].map(e=>e.textContent)')

for header in headers:
    print(header)

for cell in cells:
    print(cell)
0 голосов
/ 18 февраля 2019

Если вы используете filefox, перейдите к about:config и установите для accessibility.blockautorefresh значение true.Теперь скопируйте ваш профиль Firefox ... меню-> справка-> информация по устранению неполадок и скопируйте путь к каталогу профиля.

Установите свой профиль Firefox в Python

profile_directory = webdriver.FirefoxProfile("your/copied/path")
driver = webdriver.Firefox(profile_directory)

Для хрома скопируйте этот URL и вставьте его здесь и получите файл .crx.Получив файл crx, сделайте это на python:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
options = webdriver.chrome.options.Options()
options.add_extension("/path/to/autorefreshblocker.crx")
capabilities = options.to_capabilities()
driver = webdriver.chrome(desired_capabilities=capabilities)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...