德州哪家网站优化好,做竞猜网站合法吗,用dw做网站的好处,互联网公司起名LupuX 2017-06-18 14:24:28 11853 收藏 41分类专栏#xff1a; Auto Test 文章标签#xff1a; 自动化测试 selenium web测试 UI自动化版权一、什么是SeleniumSelenium 是一个浏览器自动化测试框架#xff0c;它主要用于web应用程序的自动化测试#xff0c;其主要特点如下… LupuX 2017-06-18 14:24:28 11853 收藏 41分类专栏 Auto Test 文章标签 自动化测试 selenium web测试 UI自动化版权一、什么是SeleniumSelenium 是一个浏览器自动化测试框架它主要用于web应用程序的自动化测试其主要特点如下开源、免费多平台、浏览器、多语言支持对web页面有良好的支持API简单灵活易于使用支持分布式测试用例执行。 Selenium经历了两个版本Selenium1.0和2.0Selenium1.0主要由以下几部分构成Selenium IDE是一个嵌入到Firefox中的插件可以实现浏览器的录制于回放功能。Selenium Grid自动化测试辅助工具可以很方便地同时在多台机器上并行运行多个测试事例。Selenium RC是Selenium的核心工具支持多种不同的语言编写的测试脚本通过Selenium RC的服务器作为代理服务器去访问应用从而达到测试的目的。主要分为以下两部分明白了Selenium1.0的家族关系Selenium2.0可以简单的认为是将WebDriver加入到了Selenium RC这一部分中去。那么Selenium RC和WebDriver有什么区别呢RC和 WebDriver 类似都可以看做是一套操作web页面的规范。当然他们的工作原理不一样。Client用来编写测试脚本来控制Selenium server的库。Server负责控制浏览器的行为包含三部分LauncherHttpProxyCore。Selenium RC 在浏览器中运行 JavaScript 应用使用浏览器内置的 JavaScript 翻译器来翻译和执行selenese 命令(Selenium 命令集合) 。WebDriver 通过原生浏览器支持或者浏览器扩展直接控制浏览器。WebDriver 针对各个浏览器而开发取代了嵌入到被测 Web 应用中的 JavaScript。与浏览器的紧密集成支持创建更高级的测试避免了JavaScript 安全模型导致的限制。除了来自浏览器厂商的支持WebDriver 还利用操作系统级的调用模拟用户输入。以后我们基本都用Selenium2.0来进行学习和脚本编写并且选定Python语言作为编写脚本的语言其实各种语言编写脚本都大同小异。二、Selenium环境搭建1. 安装Python这里暂时只说windows下的。访问Python官网https://www.Python.org/选择下载Python2或者3系列直接点击安装注意勾选将其自动添加至系统环境变量中并且勾选自动安装pip便于我们直接从cmd中使用。具体步骤不再多说网上教程很多。2. 安装Selenium安装好了Python环境之后我们直接用pip install Selenium命令来安装Selenium。3. 安装浏览器驱动这里我们需要知道的是Firefox的驱动已经集成在了Selenium WebDriver包中了不用我们自己安装了。下面看一个简单了例子#codingutf-8from Selenium import webdriver#浏览器驱动driverwebdriver.Firefox()driver.get(https://www.baidu.com)driver.find_element_by_id(kw).send_keys(Selenium2)driver.find_element_by_id(su).click()driver.quit()12345678910这个简单的例子做的事是打开Firefox访问百度首页输入Selenium2关键字进行搜索退出。运行它我们可以看见以下页面如果我们想要使用其他的浏览器呢首先必须要下载响应浏览器的驱动我们可以访问http://docs.Seleniumhq.org/download/来下载相关的驱动并将其放在系统路径中。比如我们这里把Firefox改为Chrome再运行程序可以看见4. 其他工具安装这里我们主要使用Firefox来进行演示还需要安装一些插件来方便我们后面的控件抓取。可以直接访问https://addons.mozilla.org/zh-CN/firefox/来搜索和安装一些插件比如常用的XPath和Firebug等。环境搭建完成以后我们要做的就是开始学习编写脚本的API了。三、WebDriver API本节的内容是在Python语言中如何通过Selenium WebDriver提供的各种方法来实现web自动化测试。我们会学习一下各种操作web页面的API。这里推荐一个特别好的写示例Demo用的网站http://sahitest.com/demo/index.htm它里面基本可以找到我们需要的所有场景。1. 定位元素通过firebug等工具我们可以看见页面上的各种元素如下图每个元素都有不同的标签名和属性名等Selenium可以通过这些来定位元素。在WebDriver中有以下定位元素的方法idnameclass nametag namelink textpartial link textXPathcss selector对应的在Python中定位的方法如下 find_element _by_id() find_element _by_name() … 等等八种方式(仅仅更换了关键字)。上面这些定位方式除了最后两种外我们只需要看它的名字就很明显可以知道它到底是怎么定位的。但是有个问题是我们怎么得到这些属性可以看见即使通过firebug或查看源码去观察元素时也是比较麻烦和不直观的。这里我们就要用到最后这两种强大的工具了。XPath定位在前面我们说到了安装XPath工具如果安装成功了之后在一个网页的任意位置单击右键可以看到以下页面通过firebug可以看出来一些元素的属性等信息如以下片段是搜索框和按钮的信息span classbg s_ipt_wr quickdelete-wrapspan classsoutu-btnspaninput idkw classs_ipt namewd value maxlength255 autocompleteoffa idquickdelete classquickdelete hrefjavascript:; title清空 styletop: 0px; right: 0px; display: none;aspanspan classbg s_btn_wrinput idsu classbg s_btn value百度一下 typesubmitspan12345678图中我们是在百度搜索的搜索框中点击了右键选中XPaths之后可以看到显示出了很多种定位此元素的方法从中我们也可以得到此元素的各种信息。这时在相应的方法上单击右键或左键就可以将其复制下来。使用绝对路径定位 很显然我们要定位一个元素的话可以从第一层一直往下找最终一定会找到这个元素的可以从上图看到如果想定位到搜索框的话采用绝对路径定位的话其层级有十层之多太烦人类了使用元素属性定位 我们来分析一下这种格式比如//input[idkw]如果要在脚本中使用的话应该是find_element_by_xpath(//input[idkw])这里的//表示当前页面的某个目录下input表示定位元素的标签名[id’kw’]表示这个元素的id属性值为kw。同理我们还可以用其他的属性值来定位如name、class元素的任意属性值都可以用只要它可以标识唯一的一个元素。 如果属性有重复的话可以使用逻辑运算符来连接多个属性从而区别其他属性。比如find_element_by_xpath(//input[idkw and namewd])。CSS选择器定位css选择器可以方便的选择控件的任意属性一般情况下比XPath速度要快但是有一定的学习成本。可以访问http://www.w3school.com.cn/cssref/css_selectors.asp来获取css选择器的所有使用方式。部分语法如下根据以上语法我们可以使用driver.find_element_by_css_selector(#kw)driver.find_element_by_css_selector(.s_ipt)driver.find_element_by_css_selector(maparea)123等等方式来定位元素。可以使用如下方式得到CSS层级复制之后粘贴出来可以看到如下字符串html body div#wrapper div#head div.head_wrapper div.s_form div.s_form_wrapper.soutu-env-nomac.soutu-env-index div#lg map area1可以得到规律层级之间用空格分隔元素定位的方式会展示出来。(如使用标签名的html、使用class的div.s_form、使用id的div#lg等等)所以我们上面可以使用maparea(父标签子标签)来定位百度首页那张图片的位置。关于更多CSS选择器的用法不做更多的解释了可以查看官方文档等方式来查看使用方法我们可以熟练的使用XPath或CSS选择器中的一种就可以解决大部分定位的问题了。2. 控制浏览器控制浏览器窗口大小driverwebdriver.Firefox()#设置窗口大小为xydriver.set_window_size(x,y) #最大化窗口driver.maxmize_window()12345控制浏览器前进后退 类似于点击前进后退按钮实现页面切换。要注意的是我们打开的页面是不是新建了一个标签页是不是有上级页面可以返回。driverwebdriver.Firefox()driver.get(https://www.baidu.com)driver.find_element_by_css_selector(div#u1a.mnav).click()driver.back()driver.forward()123453. 元素操作当我们获取了元素之后还要对其进行操作如点击按钮、输入文字、提交表单等。大多数页面交互的方法通过WebElement接口提供常用的有clear() 清除文本框中的文本 send_keys(*value) 模拟按键输入 click() 单击元素这几个方法很简单很方便使用。submit() 用于提交表单例如搜索框中的提交按钮。比如我们可以用如下代码直接输入搜索的关键字后用submit()提交而不用获取搜索按钮再点击。driver.find_element_by_css_selector(#kw).send_keys(selenium2).submit()1还有几个常用的方法size() 获取元素的大小尺寸 text()获取元素的文本 is_displayed()元素是否可见4. 鼠标、键盘事件模拟鼠标右键、双击、悬停、拖拽等操作会用到ActionChains类。selenium.webdriver.common.action_chains.ActionChains(driver)当调用ActionChains的方法时不会立即执行而是会将所有的操作按顺序存放在一个队列里当你调用perform()方法时队列中的时间会依次执行。ActionChains方法列表click(on_elementNone) ——单击鼠标左键click_and_hold(on_elementNone) ——点击鼠标左键不松开context_click(on_elementNone) ——点击鼠标右键double_click(on_elementNone) ——双击鼠标左键drag_and_drop(source, target) ——拖拽到某个元素然后松开drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开key_down(value, elementNone) ——按下某个键盘上的键key_up(value, elementNone) ——松开某个键move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标move_to_element(to_element) ——鼠标移动到某个元素move_to_element_with_offset(to_element, xoffset, yoffset) ——移到距某个元素(左上角)多少距离的位置perform() ——执行链中的所有动作release(on_elementNone) ——在某个元素位置松开鼠标左键send_keys(*keys_to_send) ——发送某个键到当前焦点的元素send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素123456789101112131415这些鼠标键盘事件相对来说用的并不是很多我们只需要熟练使用最常用的那些剩下的都差不多。5. 获取验证信息我们在编写功能测试用例时一般会有预期结果在自动化用例执行完成之后我们可以从页面上获取一些信息来验证用例是执行失败还是成功。最常用的几种如下driver.title -获取当前页的titledriver.current_url -获取当前页面URLdriver.find_element_by_...(...).text -获取当前控件的text信息1236.设置等待时间显示等待 - 主要使用的类和方法WebDriverWait、uitil\until_not、Expected Conditions。 请看以下简单示例# codingutf-8from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriverwebdriver.Firefox()driver.get(http://www.qq.com/)elementWebDriverWait(driver,5,0.5).until(EC.title_is(U腾讯首页))print(element)1234567891011这里调用WebDriverWait来实现在默认的一段时间内每隔一段时间检测一次当前的页面指定元素是存在。WebDriverWait()如图所示WebDriverWait有四个参数WebDriverWait(driver, timeout, poll_frequency0.5, ignored_exceptionsNone)分别是driver超时时间检测间隔超时后的异常信息。until()和until_not()WebDriverWait()一般和until()或until_not()配合使用until(method,message’ ‘) 调用该方法提供的驱动程序作为一个参数直到返回值为true同理可知道until_not(method,message’ ‘)调用该方法提供的驱动程序作为一个参数直到返回值应该为false。其中的参数method应该使用什么方法呢这里就要用到另一个常用的类了expected_conditions注意在上面的code中我们用as将其重命名为了EC这个类有很多种方法可以选用可以看到里面有很多的方法可以用来判断是否存在相应的元素。当然这里的method我们也可以用其他的方法比如WebDriverWait(driver,5,0.5).until(lambda driver: driver.find_element_by_xpath(//a[bosszonenews_n]))用这样的方式来判断是否显示出了响应的元素。隐式等待 - implicitly_wait隐式等待相对于显式等待就要简单多了driver.implicitly_wait(n)n代表等待的秒数 隐式等待相当于设置全局的等待在定位元素时对所有元素设置超时时间超出了设置时间则抛出异常默认是0。如果元素定位不到则以轮询的方式不断定位直到超时时间到达。强制等待-sleep休眠方法 - Python的time模块提供sleep(n)n为秒数。程序执行到这里的时候强制暂停所设置的时长。7. 定位一组元素在前面我们说到了8种定位方法是对单元素定位的。WebDriver还提供了与之对应的8种定位方法用于定位一组元素。区别在于element后面加了一个s如下find_elements_by_id()find_elements_by_name()...123一般用于以下场景批量操作对象如将所有的复选框选中\取消选中先获取一组对象然后在这组对象中过滤出具体定位的对象8. 多表单、多窗口切换多表单页面如图所示我们如果直接操作去点击Link Test(frame中的元素)是不可以的因为我们首先需要切换到这个frame里面才可以进行操作。通过firebug工具可以得到此页面的源码便于我们定位元素switch_to_frame(参数)方法参数可以是iframe的id、name如果没有的话也可以传入locatorswitch_to_default_content()方法用来返回上一层表单默认与据它最近的switch_to_frame方法对应。#codingutf-8from selenium import webdriverdriverwebdriver.Firefox()driver.get(http://sahitest.com/demo/iframesTest.htm)#切换到frame里面去driver.switch_to_frame(driver.find_element_by_xpath(/html/body/iframe))#进行操作driver.find_element_by_link_text(Link Test).click()#退出至上一层表单driver.switch_to_default_content()1234567891011多窗口切换如果我们打开了多个窗口然后想切换到其中的一个窗口呢那就要用到switch_to_window这个方法了请看如下代码片段driverwebdriver.Firefox()driver.get(http://www.qq.com/)#获取qq首页窗口句柄first_windowsdriver.current_window_handledriver.find_element_by_xpath(//a[bosszonenews_n]).click()#当前所有打开的窗口句柄all_handlesdriver.window_handles#进入到首页窗口for handle in all_handles: if handlefirst_windows: driver.switch_to_window(handle) print(In first_windows)#从首页打开图片页driver.find_element_by_xpath(//a[bosszonephoto_n]).click()123456789101112131415161718199. 警告框处理在WebDriver中处理js生成的alert、confirm、prompt是很简单的即用switch_to_alert()方法定位到弹出框再使用text/accept/dismiss/send_keys进行操作。看如下代码片段# codingutf-8from selenium import webdriverimport timedriverwebdriver.Firefox()driver.get(https://www.baidu.com/)#点击设置driver.find_element_by_css_selector(div#u1 a.pf).click()#点击编辑设置driver.find_element_by_class_name(setpref).click()time.sleep(1)#保存设置driver.find_element_by_css_selector(div#gxszButtona.prefpanelgo).click()time.sleep(1)#接收弹窗driver.switch_to_alert().accept()123456789101112131415161710. 操作滚动条截图操作滚动条可以使用js脚本拖动到指定地方用 driver.execute_script(arguments[0].scrollIntoView();, target)这个方法来拖动滚动条到指定的地方。其实元素没在一屏也可以直接定位并点击的。# codingutf-8from selenium import webdriverdriverwebdriver.Firefox()driver.get(http://www.qq.com/)#定位到“体育社区”target driver.find_element_by_xpath(//a[hrefhttp://sports.qq.com/fans/])#滚动到“体育社区”driver.execute_script(arguments[0].scrollIntoView();, target)12345678910截图截图操作也很简单使用driver.get_screenshot_as_file(path)即可完成截图之后 可以借助PIL模块来进行各种处理。11. 其他操作还有其他一些操作如上传下载文件、操作cookie、验证码的处理等等操作还没有用到过这些用的场景较少并且有的还比较复杂用到的时候再去学习就好了。 熟练使用以上的各部分可以写出各种常用的脚本我们算是入门Selenium了。:)