Selenium find_element_by_css_selector在页面完全加载之前触发

时间:2017-11-21 16:45:22

标签: python selenium testing webdriver performance-testing

我有一个基本的python脚本来测试网站页面速度。基本上它加载页面,检查元素是否可见,然后记录这两个事件之间的时间。

我用它来检查元素是否可见:

def wait_for_visibility(selector, timeout_seconds=10):
retries = timeout_seconds
while retries:
    try:
        element = browser.find_element_by_css_selector(selector)
        if element is not None:
            return element
    except:
        if retries <= 0:
            raise
        else:
            pass

    retries = retries - 1
raise Exception(
    "Element %s not visible despite waiting for %s seconds" % (
        selector, timeout_seconds)
)

我使用这个命令:

    test_times['page_pre_' + name] = time.time()

    browser.get(base + path)

    wait_for_visibility(selector=selector_dict[page], timeout_seconds=240)

    test_times['page_post_' + name] = time.time()

我的问题是find_element_by_css_selector似乎没有完成&amp;返回到页面之后的几秒钟(更具体地说是它应该查找的元素)已经完成加载。这真的会降低我的剧本作为最快速度的效率。

有问题的页面非常大并且是使用Vue组件构建的,如果这是它导致问题的原因那么我有没有其他方法可以查找具有selenium的特定页面加载事件?

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题,检查了之前没有加载的元素,而没有使用我自己的循环但是使用了expected_conditions,这是我使用的代码

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

...

try:
    element_present = EC.presence_of_element_located((By.CSS_SELECTOR, string))
    WebDriverWait(driver, timeout).until(element_present)
    return driver.find_elements_by_css_selector(string)
except TimeoutException:
    print "Timed out waiting for page to load"
    driver.quit()

基本上,您指定以秒为单位的超时,expected_conditions将使WebDriver等待,直到满足预期条件或时间结束。在我的情况下,这比我自己的等待元素功能更快,它可能加快你的脚本