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、测试数据和测试流程设计不够合理
例如有些测试数据可以共用就没必要重复创建了,这样也能节省很多时间。另外有些测试流程也可以尽量简化,例如:只进行一次登录操作,没必要每个流程都从登录开始。。。
版权归原作者 知识的宝藏 所有, 如有侵权,请联系我们删除。