0


Selenium 执行速度慢原因总结

1、显示等待WebDriverWait和隐式等待implicitly_wait()混用:

例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时。

隐式等待是告诉WebDriver如果在查找一个或多个不是立即可用的元素时轮询DOM一段时间。默认设置为0,表示禁用。一旦设置好,隐式等待就被设置为会话的生命周期。一般情况下不建议使用隐式等待,现在web框架很多元素都是动态加载的建议尽量使用显示等待。

常见的显示等待条件如下:

# Licensed to the Software Freedom Conservancy (SFC) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The SFC licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

import pytest

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

def test_any_of_true(driver, pages):
    pages.load("simpleTest.html")
    WebDriverWait(driver, 0.1).until(EC.any_of(EC.title_is("Nope"), EC.title_is("Hello WebDriver")))

def test_any_of_false(driver, pages):
    pages.load("simpleTest.html")
    with pytest.raises(TimeoutException):
        WebDriverWait(driver, 0.1).until(EC.any_of(EC.title_is("Nope"), EC.title_is("Still Nope")))

def test_all_of_true(driver, pages):
    pages.load("simpleTest.html")
    results = WebDriverWait(driver, 0.1).until(
        EC.all_of(EC.title_is("Hello WebDriver"), EC.visibility_of_element_located((By.ID, "oneline")))
    )
    assert results[0] is True
    assert isinstance(results[1], WebElement)

def test_all_of_false(driver, pages):
    pages.load("simpleTest.html")
    with pytest.raises(TimeoutException):
        WebDriverWait(driver, 0.1).until(EC.all_of(EC.title_is("Nope"), EC.title_is("Still Nope")))

def test_none_of_true(driver, pages):
    pages.load("simpleTest.html")
    WebDriverWait(driver, 0.1).until(EC.none_of(EC.title_is("Nope"), EC.title_is("Still Nope")))

def test_none_of_false(driver, pages):
    pages.load("simpleTest.html")
    with pytest.raises(TimeoutException):
        WebDriverWait(driver, 0.1).until(EC.none_of(EC.title_is("Nope"), EC.title_is("Hello WebDriver")))

def test_clickable_locator_true(driver, pages):
    pages.load("simpleTest.html")
    WebDriverWait(driver, 0.1).until(EC.element_to_be_clickable((By.ID, "multilinelink")))

def test_clickable_locator_false(driver, pages):
    pages.load("simpleTest.html")
    with pytest.raises(TimeoutException):
        # text element, should not be clickable
        WebDriverWait(driver, 0.1).until(EC.element_to_be_clickable((By.ID, "hiddenline")))

def test_clickable_element_true(driver, pages):
    pages.load("simpleTest.html")
    target = (By.ID, "multilinelink")
    element = driver.find_element(*target)  # grab element at locator
    WebDriverWait(driver, 0.1).until(EC.element_to_be_clickable(element))

def test_clickable_element_false(driver, pages):
    pages.load("simpleTest.html")
    with pytest.raises(TimeoutException):
        target = (By.ID, "hiddenline")  # text, should not be clickable
        element = driver.find_element(*target)  # grab element at locator
        WebDriverWait(driver, 0.1).until(EC.element_to_be_clickable(element))

2、页面加载策略不对

例如:Selenium get()方法,这个方法默认监听dom 的document.readyState这个方法,当这个方法返回"complete"时才开始操作,所以有时候明明感觉页面加载了还不执行下一步操作。。。

共有三种类型的页面加载策略.

页面加载策略可以在此链接查询 document.readyState , 如下表所述:
策略就绪状态备注normalcomplete默认值, 等待所有资源下载eagerinteractiveDOM 访问已准备就绪, 但诸如图像的其他资源可能仍在加载noneAny完全不会阻塞 WebDriver
文档的

document.readyState

属性描述当前文档的加载状态。

当通过URL导航到新页面时, 默认情况下, WebDriver将暂缓完成导航方法 (例如, driver.get())直到文档就绪状态完成. 这 并非意味着该页面已完成加载, 特别是对于使用 JavaScript 在就绪状态返回完成后 动态加载内容单页应用程序的站点. 另请注意此行为不适用于单击元素或提交表单后出现的导航行为.

如果由于下载对自动化不重要的资源(例如, 图像、css、js) 而需要很长时间才能加载页面, 您可以将默认参数

normal

更改为

eager

none

以加快会话加载速度. 此值适用于整个会话, 因此请确保您的 等待策略 足够普适

3、显示等待时间设置过长

一般web元素加载都比较快,例如:

is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\
        until_not(lambda x: x.find_element(By.ID, "someId").is_displayed())

这个显示等待时间设置为30s超时就有点长了,大部分web元素基本10s都能加载完,要因地制宜不能一视同仁,有时候这样可能在无形当中拉长了操作时间,一些比较耗时的操作(如:下载、上传等)建议单独写个方法

4、定位策略不是最优

一般来说,如果 HTML 的 id 是可用的、唯一的且是可预测的,那么它就是在页面上定位元素的首选方法。它们的工作速度非常快,可以避免复杂的 DOM 遍历带来的大量处理。

如果没有唯一的 id,那么最好使用写得好的 CSS 选择器来查找元素。XPath 和 CSS 选择器一样好用,但是它语法很复杂,并且经常很难调试。尽管 XPath 选择器非常灵活,但是他们通常未经过浏览器厂商的性能测试,并且运行速度很慢。

基于链接文本和部分链接文本的选择策略有其缺点,即只能对链接元素起作用。此外,它们在 WebDriver 内部调用 querySelectorAll 选择器。

标签名(tagName)可能是一种危险的定位元素的方法。页面上经常出现同一标签的多个元素。这在调用 findElements(By) 方法返回元素集合的时候非常有用。

建议您尽可能保持定位器的紧凑性和可读性。使用 WebDriver 遍历 DOM 结构是一项性能花销很大的操作,搜索范围越小越好。

5、测试数据和测试流程设计不够合理

例如有些测试数据可以共用就没必要重复创建了,这样也能节省很多时间。另外有些测试流程也可以尽量简化,例如:只进行一次登录操作,没必要每个流程都从登录开始。。。


本文转载自: https://blog.csdn.net/TalorSwfit20111208/article/details/131014323
版权归原作者 知识的宝藏 所有, 如有侵权,请联系我们删除。

“Selenium 执行速度慢原因总结”的评论:

还没有评论