【Selenium】

主要功能

Selenium 的主要功能:实现WEB UI测试自动化,支持多平台、多浏览器、多语言

包括:

1)WEB页面功能测试

2)浏览器兼容性测试

实现原理

Selenium2将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,

甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),就像真正的用户在操作一样。

Selenium webdriver的设计是一个典型的客户端/服务器模型,它设计了一套用于客户端和服务器之间通信的协议(The Webdriver Wire Protocol);

服务器就是我们的浏览器,当我们的脚本启动浏览器后,webdriver就会将浏览器绑定到特定的端口,并启动基于这套协议的服务,等待客户端的请求;

我们的测试代码就是客户端,当我们在脚本中调用相应接口操作浏览器时,底层就是基于webdriver定义的协议向浏览器发送http请求;

服务器接收到请求后,调用浏览器原生的API去执行操作。

主要接口

操作浏览器

maximize_window()

set_window_size(宽480, 高800)

back()

forward()

close()

quit()

查找元素的方法

find_element_by_id
find_element_by_name
find_element_by_class_name
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_css_selector
find_element_by_xpath
find_element_by_tag_name

操作测试对象

click() 点击对象

send_keys() 在对象上模拟按键输入

clear() 清除对象的内容,如果可以的话

submit() 提交对象的内容,如果可以的话

get_attribute() 定位到元素后,可通过get_attribute获取其属性值

.text 用于获取元素的文本信息

窗口定位

driver.current_window_handle

driver.window_handles

switch_to_window(handle)

driver.switch_to_window(handle)

框架切换

switch_to_frame(frame)

弹框处理

switch_to_alert()

accept

dismiss

截图

get_screenshot_as_file

等待

1、强制等待 time.sleep()

2、隐性等待implicitly_wait()

相当于设置全局的等待,在定位元素时,对所有元素设置超时时间,超出了设置时间则抛出异常;

隐式等待使得WebDriver在查找一个Element或者Element数组时,每隔一段特定的时间就会轮询一次DOM,如果Element或数组没有马上被发现的话。

隐性等待对整个driver的周期都起作用,所以只要设置一次即可。

3、显性等待

等待页面加载完成,找到某个条件发生后再继续执行后续代码,如果超过设置时间检测不到则抛出异常

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

——driver:WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)

——timeout:最长超时时间,默认以秒为单位

——poll_frequency:休眠时间的间隔(步长)时间,默认为 0.5 秒

——ignored_exceptions:超时后的异常信息,默认情况下抛 NoSuchElementException 异常

WebDriverWai()一般由 unit()或 until_not()方法配合使用:

——until(method, message=’’)      调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。

——until_not(method, message=’’)      调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

注意:until或until_not中的可执行方法method参数,不能传入WebElement对象,比如:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))  # 错误

在这里,你可以用selenium提供的 expected_conditions 模块中的各种条件,

也可以用WebElement的 is_displayed() 、is_enabled()、is_selected() 方法;

expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:

selenium.webdriver.support.expected_conditions(模块)
这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
title_is
title_contains
这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
presence_of_element_located
presence_of_all_elements_located
这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
第一个和第三个其实质是一样的
visibility_of_element_located
invisibility_of_element_located
visibility_of
这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value
这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
这个条件判断是否有alert出现
alert_is_present
这个条件判断元素是否可点击,传入locator
element_to_be_clickable
这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
第三个传入WebElement对象以及状态,相等返回True,否则返回False
第四个传入locator以及状态,相等返回True,否则返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
staleness_of
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.implicitly_wait(10) # 隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者
driver.get('https://XXX')
locator = (By.LINK_TEXT, 'CSDN')
try:
    WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
    print driver.find_element_by_link_text('CSDN').get_attribute('href')
finally:
    driver.close()

调用Javascript

execute_script()

1、点击速度太快,页面没有加载出来就进行操作:WebDriverWait

2、find_element_by_class_name

3、execute_script()

4、iframe原因定位不到元素( 由于需要定位的元素不在当前frame中)

5、动态元素

通常一个网页元素都有一个唯一的标识符,用于唯一地定位该网页中的元素。

通常情况下,唯一标识符用HTML标记的’id’属性或’name’属性来实现。

这些标识符可以是一个静态的,即不变的、字符串常量。

它们也可以是动态值,在每个页面实例上都是变化的。

猜你喜欢

转载自blog.csdn.net/weixin_39723165/article/details/81431673