Selenium是一个用于web应用程序的自动化测试工具。
Selenium直接运行在浏览器中,它可以模拟用户的行为操作。
Selenium支持IE、Google Chrome、Firefox、Opera等主流浏览器。
Selenium也支持主流开发语言,如Java、Python、C#等。
针对不同浏览器,需要下载的驱动程序不同。
以Firefox浏览器为例,
下载解压后,把geckodriver.exe文件放在Python安装程序的目录下。
很容易出现驱动程序(Driver)版本与Firefox浏览器不兼容的情况。
目前我能成功的环境为:
驱动:geckodriver-v0.24.0-win64.zip 浏览器:v58.0
针对Firefox浏览器测试代码如下:
from selenium import webdriver
driver=webdriver.Firefox()
driver.get('http://www.baidu.com/')
driver.find_element_by_id('lst-ib').send_keys('Selenium')
driver.quit()
结果:
在Selenium自动化测试中,提供了单元素定位方式和多元素定位方式。
这里以百度搜索框的输入框为例:
1、find_element_by_id(通过元素id定位到元素)
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('selenium')
driver.quit()
2、find_element_by_name(通过元素属性name定位到元素)
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_name('wd').send_keys('selenium')
driver.quit()
3、find_element_by_class_name(通过元素属性class_name定位到元素)
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_class_name('s_ipt').send_keys('selenium')
driver.quit()
4、find_element_by_xpath(通过元素属性xpath定位到元素)
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('selenium')
driver.quit()
5、find_element_by_link_text(link_text对于超链接的处理)
from selenium import webdriver
driver=webdriver.Firefox()
driver.get('http://www.baidu.com')
driver.find_element_by_link_text(u'新闻').click()
driver.quit()
6、find_element_by_partial_link_text(partial_link_text也对于超链接的处理,与link_text不同的是,它是按模糊搜索方式处理的)
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_partial_link_text(u'新闻').click()
driver.quit()
7、find_element_by_css_selector(当使用id、name等方式定位不到元素的时候,可以使用css_selector)
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
driver.find_element_by_css_selector('#kw').send_keys('Selenium')
driver.quit()
四、多个元素定位实战
在工作中,某些时候可能会发现元素的ID、NAME、CLASS_NAME等元素属性是一致的,这时,使用ID、NAME、CLASS_NAME等这些元素属性定位就无法准确地定位到具体的元素。
1、find_elements_by_tag_name
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('http://www.baidu.com')
tag_names=driver.find_elements_by_tag_name('input')
for tag_name in tag_names:
print(tag_name)
print(type(tag_names))
driver.quit()
结果:
2、find_elements_by_id
index.html如下:
Title
Python代码:
from selenium import webdriver
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/PythonProjects/MyTestingProjects/index.html')
ids=driver.find_element_by_id('login')
#输入用户名
ids[0].send_keys('wuya')
#输入密码
ids[1].send_keys('admin')
#点击“登录”按钮
ids[2].click()
driver.quit()
效果:
四、By类的分析
五、iframe元素定位实战
在自动化测试中,如果无法定位到一个元素,那么最大的可能是定位的元素属性在iframe框架中。
1、处理未嵌套的iframe
frame.html如下:
Title
Yansky课堂
Python接口测试实战
frame-1.html如下:
Title
Yansky课堂
Yansky课堂已经上线,欢迎大家关注!
frame-2.html如下:
Title
Python接口测试实战
基于Python的接口自动化测试实战课程
结果报错:
依据给出的错误信息可以发现这个错误是元素定位错误导致的。由于存在iframe框架,首先需要进入到iframe框架,再定位iframe框架中的元素。定位的方式有两种,一种是以ID定位,一种是以索引的方式。
①以ID的方式定位时的实现代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/PythonProjects/MyTestingProjects/frame.html')
#依据iframe的Id进入frame框架
driver.switch_to_frame('text')
#获取"Yansky课堂"文本信息
print(driver.find_element_by_xpath('/html/body/center/font').text)
driver.quit()
②以索引的方式进入到iframe框架中:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/PythonProjects/MyTestingProjects/frame.html')
#根据索引进入frame框架
driver.switch_to_frame(0)
#获取"Yansky课堂"文本信息
print(driver.find_element_by_xpath('/html/body/center/font').text)
driver.quit()
2、处理嵌套的iframe
下面来看看嵌套的iframe在自动化测试中如何进行元素定位,以及如何跳出嵌套。
在一个页面中嵌套一个Bing搜索页
嵌套页面
在该页面中要实现Bing的搜索框效果,首先要进入到iframe框架中,然后定位Bing首页搜索输入框的元素属性。
实现在Bing首页搜索输入框中输入关键字代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('file:///F:/PythonProjects/MyTestingProjects/frame.html')
#根据索引进入frame框架
driver.switch_to_frame('son')
#输入搜索关键字Selenium
driver.find_element_by_id('sb_form_q').send_keys('Selenium')
driver.quit()
下面是一个多层级的嵌套页面在自动化中的应用案例
多层嵌套
请输入用户名:
要想在Bing首页搜索输入框中输入搜索关键字Selenium,然后在下面的用户名输入框中输入Selenium,实现代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(60)
driver.get('file:///F:/PythonProjects/MyTestingProjects/second.html')
#根据id进入到第一层frame框架中
driver.switch_to_frame('parent')
#根据id进入到第二层frame框架中
driver.switch_to_frame('son')
#输入搜索关键字Selenium
driver.find_element_by_id('sb_form_q').send_keys('Selenium')
#跳出frame框架
driver.switch_to_default_content()
#用户名输入框中输入Selenium
driver.find_element_by_name('username').send_keys('Selenium')
driver.quit()