大家都知道基于Web的测试基础框架需要Selenium作为主要支撑。在这里,我将介绍Web测试的核心,基于Python的Selenium。1.简要介绍Selenium是用于测试Web应用程序用户界面(UI)的通用框架。它是运行端到端功能测试的强大工具。您可以用多种编程语言编写测试,Selenium可以在一种或多种浏览器中执行它们。二、环境安装安装python,这个。..无视,建议python2.7。安装基于python的selenium依赖包,命令:pipinstallselenium==2.53.6,你懂的。安装浏览器驱动包。推荐使用chrome浏览器的chromedriver.exe。对应的chrome版本一定要对,不然不行,请问安装在哪里?想放哪里就放哪里,不过一般是放在python的根目录下。下载地址:http://chromedriver.storage.g...安装PyCharm2.7左右版本,这个安装很省心~然后就可以自定义界面UI和代码风格了,这个。..忽略3.小测试1.控制浏览器#coding=utf-8fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get("http://www.baidu.com")driver.maximize_window()#最大化浏览器Displaydriver.set_window_size(480,800)#设置浏览器宽度480,高度800display"driver.back()#Backdriver.forward()#Forwarddriver.close()#Closechromedriver.quit()#退出chrome2.Object定位1.id定位:find_element_by_id()2.name定位:find_element_by_name()3.class定位:find_element_by_class_name()4.tag定位:find_element_by_tag_name()5.link定位:find_element_by_link_text()6.通过定位partial_link:find_element_by_partial_link_text()7.通过xpath定位:find_element_by_xpath()8.通过css定位:find_element_by_css_selector()上面的定位是常规操作,应该基本够用了,但是有时候会出现一些奇怪的情况定位失败或者点击失败,此时如果使用js直接执行事件,引入以下非常规操作:document.getElementsByClassName()css定位:document.querySelectorAll()search_js="document.getElementsByName('wd')[0].value='selenium';"#按名称定位,然后赋值"selenium"search_js2="document.querySelectorAll('.s_ipt')[0].value='selenium';"#通过css定位,然后赋值"selenium"button_js="document.getElementById('su').click();“#通过id定位,然后执行点击操作button_js2="document.getElementsByClassName('s_btn')[0].click()"#通过className定位,然后执行点击操作driver.execute_script(search_js2)#Execute,execute_script(script,*args)上面的定位可以再次升级,可以使用jQuery定位一波,这里可以参考之前jq选择器中思维导图总结的知识点(https://www.cnblogs.com/aoaoa...)来实现,这里和JS基本类似,忽略3.运行测试对象#coding=utf-8fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get("http://passport.kuaibo.com/login/")driver.find_element_by_id("user_name").clear()#清除输入框默认内容driver.find_element_by_id("user_name").send_keys("username")driver.find_element_by_id("user_pwd").clear()driver.find_element_by_id("user_pwd").send_keys("password")#输入输入框内容为“密码”driver.find_element_by_id("dl_an_submit").click()#通过提交操作submit()driver.find_element_by_id("dl_an_submit").submit()size=driver.find_element_by_id("kw").size#返回百度输入框的宽高text=driver.find_element_by_id("cp").text#返回百度页面底部记录信息#返回元素的属性值,可以是id,name,type或者任意otherattributeownedbytheelementattribute=driver.find_element_by_id("kw").get_attribute('type')#返回元素的结果是否可见,返回结果为True或Falseresult=driver.find_element_by_id("kw").is_displayed()driver.quit()#Exit4.鼠标键盘事件fromseleniumimportwebdriver#引入Keys类包fromselenium.webdriver.common.keysimportKeys#引入ActionChains类fromselenium.webdriver.common.action_chainsimportActionChains...#鼠标事件#定位要操作的元素right=driver.find_element_by_xpath("xx")#对定位的元素执行鼠标右键操作ActionChains(driver).context_click(right).perform()#执行鼠标双击定位元素ActionChains(driver).double_click(right)。perform()#执行鼠标移动到定位元素的操作ActionChains(driver).move_to_element(right).perform()#执行在定位元素上按下鼠标左键的操作ActionChains(driver).click_and_hold(right).perform()#定位元素原位置element=driver.find_element_by_name("xxx")#定位元素要移动的目标位置target=driver.find_element_by_name("xxx")#执行移动操作元素ActionChains(driver).drag_and_drop(element,target).perform()#键盘事件#删除多输入的一个值driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)#输入空格键+“教程”driver.find_element_by_id("kw").send_keys(Keys.SPACE)driver.find_element_by_id("kw").send_keys(u"tutorial")#ctrl+x剪切输入框内容driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')#Others键盘操作类似5.等待时间#coding=utf-8fromseleniumimportwebdriver#importWebDriverWaitpackagefromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC#importtimepackageimporttimedriver=webdriver.Chrome()driver.get("http://www.baidu.com")#WebDriverWait()方法使用,显示等待,WebDriverWait(驱动,超时时长,调用频率,忽略异常).until(可执行方法,超时时间返回信息),这里可以调用EC实现可执行方法is_disappeared=WebDriverWait(driver,30,1,(ElementNotVisibleException)).until_not(lambdax:x.find_element_by_id(“kw”).is_displayed())#until(method,message=''),调用该方法提供的驱动作为参数,直到返回值不为Falseelement.send_keys("selenium")#添加智能等待,隐式等待driver.implicitly_wait(30)driver.find_element_by_id(“苏”)。click()#添加固定休眠时间,强制等待time.sleep(5)driver.quit()6.组对象定位和层次定位,呃,忽略7.多窗口处理#coding=utf-8fromseleniumimportwebdriverimporttimedriver=webdriver.Chrome()driver.get("http://www.baidu.com/")#获取当前窗口nowhandle=driver.current_window_handle#开新窗口注册driver.find_element_by_name("tj_reg").click()allhandles=driver.window_handles#循环判断窗口是否为当前窗口handleinallhandles:ifhandle!=nowhandle:driver.switch_to_window(handle)print'nowregisterwindow!'#切换到邮箱注册标签driver.find_element_by_id("mailRegTab").click()time.sleep(5)driver.close()#回到原来的窗口driver.switch_to_window(nowhandle)driver.find_element_by_id("kw").send_keys(u"注册成功!")time.sleep(3)#ifrome处理#这里会自动识别id和name。如果没有元素,可以通过选择器找到元素,然后输入元素driver.switch_to_frame("f1")element=driver.find_element_by_id("kw")driver。switch_to_frame(元素)driver.quit() 8。提示窗口处理#coding=utf-8fromseleniumimportwebdriverimporttimedriver=webdriver.Chrome()driver.get("http://www.baidu.com/")#点击打开搜索设置驱动.find_element_by_name("tj_setting").click()driver.find_element_by_id("SL_1").click()#点击保存设置driver.find_element_by_xpath("//div[@id='gxszButton']/input").click()#获取网页警告信息alert=driver.switch_to_alert()#接收警告信息alert.accept()#取消对话框(如果有)alert.dismiss()#输入值(如果有)alert.send_keys("xxx")9.控制浏览器的滚动条,这个可以使用前面提示的jq语句实现10.Cookie处理,主要是为了处理验证码问题#coding=utf-8fromselenium导入webdriver导入timedriver=webdriver。chrome()driver.get("http://www.youdao.com")#给cookie名称和值添加session信息driver.add_cookie({'name':'key-aaaaaaa','value':'value-bbbb'})#遍历cookie中的name和value信息进行打印,当然还有上面为cookie添加的信息在driver.get_cookies():print"%s->%s"%(cookie['name'],cookie['value'])#####下面有两种删除cookie的方法######删除特定的cookiedriver.delete_cookie("CookieName")#删除所有cookiedriver.delete_all_cookies()time.sleep(2)driver.close()4.总结如果大家在软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试等方面交流经验。有兴趣的可以拨打175317069,群里会有不定期的免费资料链接。这些资料是从各个技术网站上收集整理出来的。如果大家有好的学习资料,可以私信发给我,我会注明出处,然后分享给大家。在熟悉了selenium常用API的基本操作之后,就可以在这里开始设计实际的测试用例了。一个好的自动化测试用例至少满足以下五个条件:1.一个脚本是一个完整的场景,从用户登录操作到用户退出系统,关闭浏览器。2、一个script脚本只验证一个功能点。用户登录系统后,退出系统前不要尝试验证所有功能。3、函数中尽量只验证正向逻辑,不要过多考虑反向逻辑的验证,反向逻辑有很多情况(比如手机号输入错误的情况很多)。一方面,验证复杂,需要大量的脚本。另一方面,自动化脚本本身比较脆弱,很多异常逻辑的验证能力不强。(我们尽量按照用户正常使用的原则来编写脚本)4、脚本之间应该没有关联,也就是说,每个编写的脚本都是独立的,不能依赖或影响其他脚本。5.如果数据被修改,需要恢复数据。6.只验证整个脚本中的验证点,不验证整个脚本的每一步。最后配合unittest或testNG单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手地开展自动化测试工作。来源:https://blog.csdn.net/Stephen...
