selenium + python 自动化测试

本文介绍了如何使用Selenium进行自动化测试,包括环境搭建、浏览器驱动安装、基本操作演示及中级应用技巧等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境搭建

1.python 下载地址
根据自己的操作系统32/64 位,选择相应的版本。
2.配置环境变量
修改我的电脑->属性->高级->环境变量->系统变量中的PATH为:
变量名:PATH
变量值:;C:\Python35;C:\Python35\Scripts; 
3、安装selenium
3.1、通过pip 安装
C:\Users\fnngj>python3 -m pip install selenium 
3.2、通过下载包安装
或者直接下载selenium包:
解压,cmd进入目录:
C:\selenium\selenium2.53.5> python3 setup.py install
三. 安装三大浏览器驱动driver
     1.chromedriver 下载地址: https://code.google.com/p/chromedriver/downloads/list
     2.Firefox的驱动geckodriver 下载地址: https://github.com/mozilla/geckodriver/releases/
     3.IE的驱动IEdriver 下载地址: http://www.nuget.org/packages/Selenium.WebDriver.IEDriver/
geckodriver
这是因为在Firefox高版本需要使用 geckodriver 来驱动,
不再使用Seleniu默认自带的Firefox webdriver。

python -m pip install PyMySQL

表示chrome浏览器版本为54.0.2840.99,但是chromedriver版本为2.9.248315。版本不兼容
网上找了遇到相同问题的解决办法 http://blog.youkuaiyun.com/u012246342/article/details/52860949
下载v2.24版本的chromedriver.exe替换原有的chromedriver.exe(下载地址: http://chromedriver.storage.googleapis.com/index.html?path=2.24/ )
重新运行脚本,第一次运行较慢,最终超时失败,第二次运行成功!!
 

初级
from selenium import webdriver   # 导入webdriver包  
driver = webdriver.Firefox()    # 初始化一个火狐浏览器实例:driver  
driver = webdriver.Chrome()  
driver = webdriver.Ie() 
driver.maximize_window()  # 最大化浏览器  
driver.implicitly_wait(8) # 设置隐式时间等待  
driver.maximize_window()        # 最大化浏览器  
driver.get("https://www.baidu.com")  # 通过get()方法,打开一个url站点  
driver.quit()     #关闭并退出浏览器  
xpath
driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")  # 搜索输入框输入Selenium  
driver.find_element_by_xpath("//*[@id='su']").click()  #点击百度一下按钮
driver.find_element_by_id( "kw" )
driver.find_element_by_tag_name( "form" )
driver.find_element_by_link_text( "新闻" )
driver.find_element_by_partial_link_text( "主页" ).click()
driver.find_element_by_class_name( "s_ipt" )
driver.find_element_by_name( "wd"
driver.find_element_by_css_selector( "#su" )
driver.find_element_by_id( "kw" ).send_keys( "Selenium" )
driver.find_element_by_id( "kw" ).clear()
driver.refresh()
elem_news.click()
driver.back()
driver.forward()
driver.capabilities[ 'version' ]
driver.current_url
driver.title
time.sleep(1) 
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')  # 触发ctrl + t 
for i in driver.find_elements_by_xpath("//*/input[@type='radio']"):  
i.click()  
driver.find_element_by_xpath( "//*[@name='memberPass']" ).click()
driver.set_window_size(1280,800)
是否选中
driver.find_element_by_xpath( "//*[@id='news']" ).is_selected() 
控件尺寸
search_btn = driver.find_element_by_id( 'su' )  
search_btn.size
全选
element = driver.find_element_by_tag_name( 'body' )  
element.send_keys(Keys.CONTROL +  'a'
退格删除
element = driver.find_element_by_id( 'kw' )  
element.send_keys( "Selenium automation" )  
time.sleep(1)  
element.send_keys(Keys.CONTROL+ 'a' )  
element.send_keys(Keys.BACKSPACE)
element = driver.find_element_by_xpath( "//*[@id='lg']/img" )  
actionChains = ActionChains(driver)  
actionChains.context_click(element).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() 
执行js
driver.execute_script( "window.alert('这是一个alert弹框。');"
切换窗口
driver.find_element_by_xpath( "//*[@id='pane-news']/div/ul/li[1]/strong/a" ).click()  
print  driver.current_window_handle  # 输出当前窗口句柄   
handles = driver.window_handles  # 获取当前全部窗口句柄集合   
print  handles  # 输出句柄集合   
for  handle  in  handles: # 切换窗口   
if  handle != driver.current_window_handle:  
print   'switch to second window' ,handle  
driver.close()  # 关闭第一个窗口   
driver.switch_to.window(handle)  #切换到第二个窗口
iframe切换
driver.switch_to.frame( "iframe1"
alert弹窗
driver.switch_to_alert().accept()   # 点击弹出里面的确定按钮   
#driver.switch_to_alert().dismiss() # 点击弹出上面的X按钮
获取全部图片信息
for  image  in  driver.find_elements_by_tag_name( "img" ):  
  print  (image.text)  
  print  (image.size)  
print  (image.tag_name)
获取href属性
for  link  in  driver.find_elements_by_xpath( "//*[@href]" ):  
print  (link.get_attribute( 'href' )) 
保存截图
driver.get_screenshot_as_file( "C:\\Users\\你的账户名\\Desktop\\baidu.png" )  

中级
类、函数、模快调用
1. 类的定义,class开头的就表示这是一个类,小括号里面的,表示这个类的父类,涉及到继承,默认object是所有类的父类。python中定义类,小括号内主要有三种:
1. 具体一个父类,2. object 3. 空白
2. 函数或方法的定义, def开头就表示定义一个函数,方法包括,实例方法,
类方法,静态方法,
注意看 类方法和静态方法定义的时候上面有一个@标记。
3. 对象调用方法和类调用方法的使用。
示例:
class ClassA(object):
string1 = "这是一个字符串。"
def instancefunc(self):
print ('这是一个实例方法。')
print (self)
@classmethod
def classfunc(cls):
print ('这是一个类方法。')
print (cls)
@staticmethod
def staticfun():
print ('这是一个静态方法。')
test = ClassA() # 初始化一个ClasssA的对象,test是类ClassA的实例对象
test.instancefunc() # 对象调用实例方法
test.staticfun() # 对象调用静态方法
test.classfunc() # 对象调用类方法
print test.string1 # 对象调用类变量
ClassA.instancefunc(test) # 类调用实例方法,需要带参数,这里的test是一个对象参数
ClassA.instancefunc(ClassA) # 类调用实例方法,需要带参数,这里的ClassA是一个类参数
ClassA.staticfun() # 类调用静态方法
ClassA.classfunc() # 类调用类方法
super用来执行父类中的函数
命名规则
python中默认规则,包名和文件名都是小写,类名称单词首字母大写,函数名称小写,多个字母下划线隔开。
入口函数
if  __name__ ==  '__main__' :
构造函数 __init_
读取配置文件
import  ConfigParser 
config = ConfigParser.ConfigParser()  
file_path = os.path.dirname(os.path.abspath('.')) + '/config/config.ini'  
config.read(file_path)  
browser = config.get("browserType", "browserName")  
url = config.get("testServer", "URL") 
获取时间
time.time()
time.localtime()
time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime(
字符串切割
search_result_string.split( '约' )[1]
日志
  1. 指定保存日志的文件路径,日志级别,以及调用文件 
  2.             将日志存入到指定的文件中 
  3.         :param logger: 
  4.         """  
  5.         # 创建一个logger  
  6.         self.logger = logging.getLogger(logger)  
  7.         self.logger.setLevel(logging.DEBUG)  
  8.   
  9.         # 创建一个handler,用于写入日志文件  
  10.         rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))  
  11.         log_path = os.path.dirname(os.getcwd()) + '/Logs/'  
  12.         log_name = log_path + rq + '.log'    
  13.         fh = logging.FileHandler(log_name)  
  14.         fh.setLevel(logging.INFO)  
  15.   
  16.         # 再创建一个handler,用于输出到控制台  
  17.         ch = logging.StreamHandler()  
  18.         ch.setLevel(logging.INFO)  
  19.   
  20.         # 定义handler的输出格式  
  21.         formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
  22.         fh.setFormatter(formatter)  
  23.         ch.setFormatter(formatter)  
  24.   
  25.         # 给logger添加handler  
  26.         self.logger.addHandler(fh)  
  27.         self.logger.addHandler(ch)
继承 class  ClassB(ClassA): 

unittest测试单元
所有的测试函数都要test开头
测试固件(test fixture)
一个测试固件包括两部分,执行测试代码之前的准备部分和测试结束之后的清扫代码。这两部分一般用函数setUp()和tearDown()表示。
测试用例(test case)
一个测试用例,包括测试固件,和具体测试业务的函数或者方法
测试套件 (test suite)
就是很多测试用例的集合
测试执行器 (test runner)
用来执行加载测试用例,并执行用例,且提供测试输出的一个组建
  runner=unittest.TextTestRunner()  
 runner.run(suite
POM 页面与逻辑分离(基类+业务类+测试类)
加载测试用例到测试套件
suite = unittest.TestSuite()  
suite.addTest(BaiduSearch( 'test_baidu_search' )) 
一次性加载一个类文件下所有测试用例到suite中
suite = unittest.TestSuite(unittest.makeSuite(BaiduSearch))
加载指定包下的所有用例
suite = unittest.TestLoader().discover( "testsuites"
生成测试报告HTMLTestRunner


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值