Как я могу использовать селен для записи времени загрузки mathjax - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь использовать селен для получения асинхронных элементов (уравнение MathJax).

Я пытаюсь написать скрипт python-selenium для записи времени загрузки моего сайта, но мой сайт содержит много уравнений, которые преобразованы Mathjax асинхронно, так что я не могу записать его правильно.

Я пытаюсь использовать «performance.timing», чтобы сначала записать время загрузки, но это может дать мне только «время загрузки».

from selenium import webdriver
source = "url"
driver = webdriver.Chrome()
driver.get(source)
navigationStart = driver.execute_script("return window.performance.timing.navigationStart")
loadEventEnd = driver.execute_script("return window.performance.timing.loadEventEnd")
load_time = loadEventEnd - navigationStart

Затем я пытаюсь найти идентификатор «MathJax» и ждать, пока не загрузится один элемент mathjax (например, «MathJax-Element-1-Frame»)

from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
source = "url"
driver = webdriver.Chrome()
begin = time.time()
driver.get(source)
locator = (By.ID, 'MathJax-Element-1-Frame')
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
end = time.time()
finish_time = end - begin

Но время не совсем правильное.

1 Ответ

2 голосов
/ 17 июня 2019

Попробуйте использовать datetime.utcnow() с timedelta, то есть:

Длительность, выражающая разницу между двумя экземплярами даты и времени с микросекундным разрешением.

from datetime import datetime, timedelta
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
source = "url"
driver = webdriver.Chrome()
begin = datetime.utcnow() + timedelta(1)
driver.get(source)
locator = (By.ID, 'MathJax-Element-1-Frame')
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
end = datetime.utcnow() + timedelta(1)
finish_time = end - begin

Обновление

Эта функция ожидает загрузки всех pendingRequests.Это может помочь и в вашем случае.

def wait_until_loaded(driver, seconds: int = 30) -> None:
    java_script_to_load = "var injector = window.angular.element('body').injector();"\
                                  " var $http = injector.get('$http');" \
                                  "return ($http.pendingRequests.length === 0);"
    end_time = datetime.utcnow() + timedelta(seconds=seconds)
    print("wait for All Elements....")
    while datetime.utcnow() <= end_time:
        try:
            if driver.execute_script(java_script_to_load):
                print(f"loaded in"
                      f" {datetime.utcnow() + timedelta(seconds=seconds) - end_time}seconds")
                sleep(1)
                return
        except WebDriverException:
            continue
        sleep(0.1)
    raise TimeoutError("waiting for elements for too long")

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...