专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Web自动化测试

  1。selenium使用方法1。1操作浏览器
  1、启动浏览器(实例化浏览器)
  启动Chrome浏览器(驱动已放入path环境变量下)driverwebdriver。Chrome()
  指定驱动路径驱动Chrome浏览器。driverchromedriver。exe为驱动存放位置,可以是相对路径或者绝对路径driverwebdriver。Chrome(executablepathr。driverchromedriver。exe)
  启动Firefox浏览器driverwebdriver。Firefox()指定驱动路径启动driverwebdriver。Firefox(executablepath。。drivergeckodriver。exe)
  启动IE浏览器driverwebdriver。Ie()指定驱动路径启动driverwebdriver。Ie(executablepathr。driverIEDriverServer。exe)
  2、最大化浏览器driver。maximizewindow()
  driver为实例化浏览器对象(下同)
  3、设置浏览器大小driver。setwindowsize(480,800)width400,height800
  4、打开网页driver。get(https:www。zhihu。com)
  5、使用另外窗口打开网页新开一个窗口,通过执行js来新开一个窗口jswindow。open(https:mail。163。com);driver。executescript(js)
  6、控制浏览器前进、后退driver。get(https:www。zhihu。com)driver。get(https:mail。163。com)在同一窗口重新打开一个网页driver。back()后退到知乎driver。forward()前进换回到163
  7、获取网页标题titledriver。title获取网页的title
  获取到的title为页面源码head标签中title中的文本信息
  8、获取网页的URLurldriver。currenturl获取网页的URL
  获取的url为当前浏览器地址栏中的url
  9、刷新页面driver。refresh()
  10、获取浏览器窗口大小sizedriver。getwindowsize()
  返回为字典型如:{width:1050,height:840}
  11、关闭浏览器driver。close()
  关闭的是当前浏览器窗口的页签,存在多个窗口时关闭当前的活动窗口
  12、退出浏览器driver。quit()
  关闭整个浏览器,包括webdriver的进程也会退出1。2获取元素对象
  八种属性定位页面元素:
  序号
  类型
  示例
  1hrid定位
  findelement(By。ID,id值)
  2hrname定位
  findelement(By。NAME,name值)
  3hrtag定位
  findelement(By。TAGNAME,id值)
  4hrclass定位
  findelement(By。CLASSNAME,class值)
  5hrlinktext定位
  findelement(By。LINKTEXT,文本值)
  6hrpartiallink定位
  findelement(By。PARTIALLINKTEXT,文本模糊值)
  7hrXPath定位
  findelement(By。XPATH,唯一路径标识)
  8hrCSSselector定位
  findelement(By。CSSSELECTOR,各种组合),实际使用最多
  webdriver中元素定位元素的简便方法:driver。findelementbyid(元素id属性)最常用,简单driver。findelementbyname(元素name属性)最常用,简单driver。findelementbyclassname(元素class属性)易重复,看情况使用driver。findelementbytagname(元素标签名)最不靠谱driver。findelementbylinktext(链接文本)精确匹配链接(标签中的文字)driver。findelementbypartiallinktext(‘部分链接文本’)模糊匹配链接driver。findelementbyxpath()最灵活,万能的灵药driver。findelementbycssselector()没xpath灵活
  1、id元素定位
  inputidqueryclasssecinputnamequerymaxlength100autocompleteofftypetextdriver。findelementbyid(query)driver。findelement(By。ID,query)
  2、name元素定位
  inputidqueryclasssecinputnamequerymaxlength100autocompleteofftypetextdriver。findelementbyname(query)driver。findelemnet(By。NAME,query)
  3、classname元素定位
  inputidqueryclasssecinputnamequerymaxlength100autocompleteofftypetextdriver。findelementbyclassname(secinput)driver。findelement(By。CLASSNAME,secinput)
  4、tagname元素定位(最不靠谱)
  inputidqueryclasssecinputnamequerymaxlength100autocompleteofftypetextdriver。findelementbytagname(input)driver,findelement(By。TAGNAME,input)
  5、linktext元素定位
  页面底部搜狗输入法连接
  搜狗输入法driver。findelementbylinktext(搜狗输入法)driver。findelement(By。LINKTEXT,搜狗输入法)
  注意:连接文本是标签对之间的文本
  6、partiallinktext元素定位
  iclassi1i搜狗输入法driver。findelementbypartiallinktext(输入法)driver。findelement(By。PARTIALLINKText,输入法)
  7、XPath元素定位(强大)
  xpath可以根据元素的父节点或者哥哥弟弟节点定位到元素。
  driver。findelementbyxpath(‘form〔idsf〕input〔typetext〕’)上级节点定位下级子节点driver。findelementbyxpath(‘span〔classenterinput〕precedingsibling::spaninput’)通过节点的弟弟节点定位
  注意:使用xpath最好不要使用工具获取,手写的可靠性更高
  8、css元素定位
  css定位元素比xpath块,id,name,class,tagname都是转换为css后定位元素。具体请看findelement方法的代码。
  driver。findelementsbycssselector(。secinput)。表示classdriver。findelementsbycssselector(query)表示id1。3操作元素对象
  一、元素的常用操作
  element。click()单击元素;除隐藏元素外,所有元素都可单击
  element。submit()提交表单;可通过form表单元素提交表单
  element。clear()清除元素的内容;如果可以的话
  element。sendkeys(‘需要输入的内容’)模拟按键输入;只针对支持输入的元素
  注意:sendkeys()输入的内容必须为字符串
  搜狗查询实例:fromseleniumimportwebdriverimporttimedriverwebdriver。Chrome()driver。maximizewindow()最大化driver。get(rhttps:www。sogou。com)打开网页driver。findelementbyid(query)。sendkeys(selenium)搜索框输入seleniumtime。sleep(2)等待3秒driver。findelementbyid(query)。clear()清除搜索框内容time。sleep(2)driver。findelementbyid(query)。sendkeys(selenium)重新输入内容driver。findelementbyid(sf)。submit()提交搜索框的表单driver。findelementbyid(stb)。submit()提交按钮也可提交表单,单击按钮也可以time。sleep(2)driver。quit()关闭浏览器
  注意:submit()提交表单,可以是提交按钮,也可以是表单元素,也可以是输入框元素
  二、元素的常用方法
  element。location返回元素的坐标字典(相对于网页左上角0,0开始)
  element。text获取元素的文本,页面上看得到的文本
  element。getattribute(属性名称)获得元素的属性强调有
  element。getproperty(属性名称)获得元素的固有属性值强调专
  element。isdisplayed()返回元素的结果是否可见,有些元素肉眼可见,但是他是隐藏的
  示例:fromseleniumimportwebdriverimporttimedriverwebdriver。Chrome()driver。maximizewindow()最大化driver。get(rhttps:www。sogou。com)打开网页driver。findelementbyid(query)。sendkeys(selenium)搜索框输入seleniumelementdriver。findelementbyid(query)print(搜索框的内容为:,element。getattribute(value))print(搜索框的class属性:,element。getattribute(class))print(搜索框的type属性:,element。getattribute(type))print(搜索框的坐标位置:,element。location)print(搜索框是否可操作:,element。isdisplayed())time。sleep(2)textdriver。findelementbyclassname(erwmbox)。text获取二位码的文本print(底部二维码的文本为:,text)time。sleep(2)driver。quit()关闭浏览器
  1、element。location获取元素的坐标位置
  对于已加载到浏览器的底部元素,操作元素时现在chrome无法自动拖动滚动条,需要获取元素位置后,采用js拖动滚动条到相应位置采用操作元素。
  2、element。text获取元素的文本spanclassewmspanp搜狗搜索APPpclassp2搜你所想
  如上,我们定位classerwmbox元素,获取到的文本是〔搜狗搜索APP搜你所想〕,也就是界面上能看到的文字内容。输入框除外(输入框的值是存储在value属性中),只要是界面上的文本内容都可以获取。
  多用于校验点。
  3、element。getattribute(属性名称)获取对应的属性值,强调有
  inputtypetextclasssecinputnamequeryidquerymaxlength100autocompleteoff
  如上搜索输入框的属性有type、class、name、id、maxlength、autocomplete;我都可以通过getattribute()获取到他的值,因为他’有’。
  value是特殊的属性,输入框,单项按钮,多选按钮多具有改属性。
  4、element。getproperty(属性名称)获得元素的固有属性值,强调专
  它与getattribute()差别,getproperty()是获取元素的固有属性。
  我们所有的元素都有特定固有属性,如id、type、value等。
  当使用getattribute()无法获取到属性的值时,可使用getproperty()。
  5、element。isdisplayed()判定改元素是否可见
  当我们定位到了元素,但是无法操作时,可以看看他是否可见,不可见不一定就是在界面上消失了。
  6、其他方法
  element。size元素的大小
  element。isenabled()元素是否可用
  element。isselected()元素是否被选中,用于检测复选框或单项按钮是否被勾选1。4设置等待时间
  一、time。sleep(seconds)固定等待importtimetime。sleep(3)等待3秒
  time。sleep(seconds)seconds参数为整数,单位(秒)。
  它是Python的time提供的休眠方法。
  常用于短时间的等待,为了自动测试用例的执行效率固定等待的时间需要控制在3秒内。在用例中尽量少用固定等待。
  二、智能隐性的等待implicitlywait(回应超时等待)
  driver。implicitlywait(timetowait)
  回应超时等待,隐性的,设置后对应的是全局,如查找元素。driver。implicitlywait(10)设置全局隐性等待时间,单位秒
  每次driver执行找不到元素都会等待设置的时间,它的值设置的过长对用例执行效率有很大的影响,必须在执行完成之后还原回来。driver。implicitlywait()要慎之又慎的使用。
  driver对它的默认值为0,driver。implicitlywait(0)能还原隐性等待的设置时间。
  三、智能显性等待WebDriverWait
  WebDriverWait(driver,timeout,pollfrequency0。5,ignoredexceptionsNone)
  参数说明:
  driver为webdriver驱动timeout最长超时时间,单位(秒)pollfrequency循环查找元素每次间隔的时间,默认0。5秒ignoredexceptions超时后需要输出的异常信息
  WebDriverWait()下面有两个方法可用until()和untilnot()
  WebDriverWait(driver,timeout)。until(method,message)
  method函数或者实例call()方法返回True时停止,否则超时后抛出异常。
  参数说明:
  method在等待时间内调用的方法或者函数,该方法或函数需要有返回值,并且只接收一个参数driver。message超时时抛出TimeoutException,将message传入异常显示出来
  WebDriverWait(driver,timeout)。untilnot(method,message)
  于上面的until()相反,untilnot中的method函数或者实例call()方法返回False结束,否则抛出异常。
  until方法使用的method的函数或者类call()方法详解:
  函数我们一般采用匿名函数lambda。
  lambdadriver:driver。findelement(定位元素)当定位的元素时为True,无元素时为False。如示例1、2:
  WebDriverWait示例1:WebDriverWait(driver,5)。until(lambdadriver:driver。findelementbyid(query))
  5秒内等待元素(idquery)出现,lambdadriver:driver。findelementbyid(query)为一个匿名函数,只有一个driver参数,返回的是查找的元素对象。
  WebDriverWait示例2:WebDriverWait(driver,5)。untilnot(lambdadriver:driver。findelementbyname(query))
  5秒内等待元素消失,同示例1untilnot要求无元素返回即元素不存在于该页面。
  定义类中的call()方法。classwaitelement(object):definit(self,locator):self。locatorlocatordefcall(self,driver):returndriver。findelement(self。locator)WebDriverWait(driver,5)。until(waitelement((By。ID,query)))等待元素出现WebDriverWait(driver,5)。untilnot(waitelement((By。ID,query)))等待元素消失
  waitelement类中init()方法接收需要定位的元素,call()方法中只能有唯一变量driver,并且返回元素对象。
  这样做是是不是很麻烦,其实selenium提供的一个库进行操作,expectedconditions库。引入位置
  fromselenium。webdriver。supportimportexpectedconditionsasec,它囊括了我们需要使用等待的所有情况。
  四、expectedconditions类库fromselenium。webdriver。supportimportexpectedconditionsasec引入包
  下面示例都是以搜狗搜索首页为例。
  方法中参数说明locator(By。ID,id)表示使用By方法定位元素的元组,element表示获取的webElement元素对象。
  ec。titleis(‘title’)判断页面标题等于title
  ec。titlecontains(‘title’)判断页面标题包含titleWebDriverWait(driver,10)。until(ec。titleis(搜狗搜索引擎上网从搜狗开始))等待title于参数相等WebDriverWait(driver,10)。until(ec。titlecontains(搜狗搜索引擎))等待title包含参数的内容
  ec。presenceofelementlocated(locator)等待locator元素是否出现
  ec。presenceofallelementslocated(locator)等待所有locator元素是否出现WebDriverWait(driver,10)。until(ec。presenceofelementlocated((By。ID,query)))WebDriverWait(driver,10)。until(ec。presenceofallelementslocated((By。ID,query)))
  ec。visibilityofelementlocated(locator)等待locator元素可见
  ec。invisibilityofelementlocated(locator)等待locator元素隐藏
  ec。visibilityof(element)等待element元素可见WebDriverWait(driver,10)。until(ec。visibilityofelementlocated((By。ID,stb)))等待元素可见WebDriverWait(driver,10)。until(ec。invisibilityofelementlocated((By。ID,stb)))等待元素隐藏WebDriverWait(driver,10)。until(ec。visibilityof(driver。findelementbylinktext(高级搜索)))等待元素可见
  ec。texttobepresentinelement(locator,text)等待locator的元素中包含text文本
  ec。texttobepresentinelementvalue(locator,value)等待locator元素的value属性为valueWebDriverWait(driver,10)。until(ec。texttobepresentinelement((By。ID,erwx),搜索APP))等待元素中包含搜索APP文本WebDriverWait(driver,10)。until(ec。texttobepresentinelementvalue((By。ID,query),selenium))等待元素的值为selenium,一般用于输入框
  ec。frametobeavailableandswitchtoit(locator)等待frame可切入WebDriverWait(driver,10)。until(ec。frametobeavailableandswitchtoit((By。ID,frame)))WebDriverWait(driver,10)。until(ec。frametobeavailableandswitchtoit(frameid))ec。alertispresent()等待alert弹出窗口出现WebDriverWait(driver,10)。until(ec。alertispresent())
  ec。elementtobeclickable(locator)等待locator元素可点击WebDriverWait(driver,10)。until(ec。elementtobeclickable((By。ID,kw)))
  等待元素被选中,一般用于复选框,单选框
  ec。elementtobeselected(element)等待element元素是被选中
  ec。elementlocatedtobeselected(locator)等待locator元素是被选中ec。elementselectionstatetobe(element,isselected)等待element元素的值被选中为isselected(布尔值)
  ec。elementlocatedselectionstatetobe(locator,isselected)等待locator元素的值是否被选中isselected(布尔值)fromseleniumimportwebdriverimporttimefromselenium。webdriver。support。waitimportWebDriverWaitfromselenium。webdriver。supportimportexpectedconditionsasec引入包fromselenium。webdriver。common。byimportBydriverwebdriver。Chrome()driver。maximizewindow()driver。get(rhttps:www。baidu。com)driver。findelementbylinktext(设置)。click()WebDriverWait(driver,3)。until(ec。elementtobeclickable((By。LINKTEXT,搜索设置)))等待搜索可点击,不可缺少driver。findelementbylinktext(搜索设置)。click()elementdriver。findelementbyid(s11)WebDriverWait(driver,2)。until(ec。elementtobeselected(element))element被选中WebDriverWait(driver,10)。until(ec。elementlocatedtobeselected((By。ID,SL0)))id’SL0’被选中WebDriverWait(driver,10)。until(ec。elementselectionstatetobe(element,True))element被选中WebDriverWait(driver,10)。until(ec。elementlocatedselectionstatetobe((By。ID,SL1),False))id’SL1’不被选中time。sleep(3)driver。quit()
  五、什么时候使用等待
  固定等待sleep与隐性等待implicitlywait尽量少用,它会对测试用例的执行效率有影响。
  显性的等待WebDriverWait可以灵活运用,什么时候需要用到?
  1、页面加载的时候,确认页面元素是否加载成功可以使用WebDriverWait
  2、页面跳转的时候,等待跳转页面的元素出现,需要选一个在跳转前的页面不存在的元素
  3、下拉菜单的时候,如上百度搜索设置的下拉菜单,需要加上个时间断的等待元素可点击
  4、页面刷新的时候
  总之,页面存在改变的时候;页面上本来没的元素,然后再出现的元素1。5键盘鼠标事件ActionChains
  一、鼠标点击操作
  click(elementNone)左击contextclick(elementNone)右击doubleclick(elementNone)双击movetoelement(element)移动鼠标到元素中间(悬停)draganddrop(source,target)source上按下左键拖动到target元素上clickandhold(elementNone)在元素上按下鼠标左键release()释放鼠标perform()执行ActionChains中存储的动作
  element有None默认值的表示不传入参数该动作在原地执行。
  鼠标事件具体使用示例如下:
  示例1:鼠标左键点击actionActionChains(driver)action。click()在鼠标当前位置单击action。perform()执行action存储的动作鼠标在新闻元素位置单击action。click(driver。findelementbylinktext(新闻))。perform()
  注意:action。click()动作并未执行,它只是存储在action实例中,需要通过action。perform()方法执行存储动作;鼠标键盘事件动作动作可以存储多个,然后一次性执行。如下执行CytlC:ActionChains(driver)。keydown(Keys。CONTROL)。sendkeys(c)。keyup(Keys。CONTROL)。perform()
  示例2:鼠标右击actionActionChains(driver)action。contextclick()。perform()在鼠标当前位置右击鼠标在新闻元素位置右击action。contextclick(driver。findelementbylinktext(新闻))。perform()
  示例3:鼠标双击操作actionActionChains(driver)action。doubleclick()。perform()在鼠标当前位置双击鼠标在新闻元素位置双击击action。doubleclick(driver。findelementbylinktext(新闻))。perform()
  示例4:鼠标移动actionActionChains(driver)elementdriver。findelementbylinktext(设置)鼠标移动到新闻元素上的中心点action。movetoelement(element)。perform()鼠标在原位置向x轴移动xoffset、y轴移动yoffset;xoffset、yoffset可为正负数action。movebyoffset(200,100)。perform()鼠标移动到element元素中心点偏移xoffset、yoffsetaction。movetoelementwithoffset(element,500,600)。perform()
  action。movebyoffset(xoffset,yoffset)这里需要注意,如果xoffset为负数,表示横坐标向左移动,yoffset为负数表示纵坐标向上移动。而且如果这两个值大于当前屏幕的大小,鼠标只能移到屏幕最边界的位置。
  鼠标移动操作在测试环境中比较常用到的场景是需要获取某元素的flyovertips,实际应用中很多flyover只有当鼠标移动到这个元素之后才出现,所以这个时候通过执行movetoelement(toelement)操作,就能达到预期的效果。
  根据我个人的经验,这个方法对于某些特定产品的图标的flyovertips也不起作用,虽然在手动操作的时移动鼠标到这些图标上面可出现flyover,但当使用WebDriver来模拟这一操作时,虽然方法成功执行,但flyover却不出来。所以在实际应用中,还需要对具体的产品页面做相应的处理。
  示例5:鼠标悬停action。clickandhold()。perform()鼠标在当前位置按下并不释放鼠标在设置上悬停action。clickandhold(driver。findelementbylinktext(设置))。perform()action。clickandhold(element)这个方法实际上是执行了两个动作,首先是鼠标移动到元素element,然后再clickandhold,所以这个方法也可以写成action。movetoelement(element)。clickandhold()。
  示例6:鼠标拖拽sourcedriver。findelementbyid(kw)获取起始位置元素targetdriver。findelementbyid(sk)获取目标元素将元素source拖动到target的位置ActionChains(driver)。draganddrop(source,target)。perform()鼠标拖拽动作,将source元素向x、y轴方向移动(xoffset,yoffset),其中xoffset为横坐标,yoffset为纵坐标。ActionChains(driver)。draganddropbyoffset(source,100,100)。perform()
  在这个拖拽的过程中,已经使用到了鼠标的组合动作,首先是鼠标点击并按住clickandhold(source)元素,然后执行鼠标移动动作(moveto),移动到target元素位置或者是(xoffset,yoffset)位置,再执行鼠标的释放动作(release)。所以上面的方法也可以拆分成以下的几个执行动作来完成:ActionChains(driver)。clickandhold(source)。movetoelement(target)。release()。perform()
  示例7:鼠标释放操actionActionChains(driver)action。release()。perform()释放按下的鼠标
  二、键盘操作
  对于键盘的模拟操作,ActionChains类中有提供了按下keydown(keys)、释放keyup(keys)、按下并释放sendkeys(keystosend)等方法。
  键盘的操作有普通键盘和修饰键盘两种。
  普通键盘为常用字母数字等;修饰键盘为Ctrl、Shift、Alt等,修饰键盘一般和其他键组合使用的键。
  使用键盘操作时需要引入fromselenium。webdriver。common。keysimportKeys包,Keys包中含所有特殊用键。
  1、普通键盘操作
  键盘操作使用sendkeys(keystosend)方法,该方法支持多个按键连续操作,如果需要对某个元素执行按键操作使用sendkeystoelement(element,keystosend)方法。具体使用如下示例:fromselenium。webdriver。common。keysimportKeysactionActionChains(driver)action。sendkeys(Keys。SPACE)。perform()按下并释放空格键action。sendkeys(Keys。TAB)。perform()按下并释放Tab键action。sendkeys(Keys。BACKSPACE)。perform()按下并释放Backspace键action。sendkeys(Keys。BACKSPACE,Keys。SPACE)。perform()连续执行按键动作action。sendkeys(Keys。TAB)。sendkeys(Keys。TAB)。perform()也可以这样组合针对某个元素发出某个键盘的按键操作,或者是输入操作elementdriver。findelementbyid(query)对一元素使用键盘操作action。sendkeystoelement(element,selenium)。perform()上面动作拆解为下面动作action。click(element)。sendkeys(selenium)。perform()
  注意除了ActionChains类有sendkeys(keystosend)方法外,WebElement类也有一个sendkeystoelement(keystosend)方法,这两个方法对于一般的输入操作基本上相同,不同点在于以下几点:
  第一:Actions中的sendkeys(keystosend)对修饰键操作后并不会释放,也就是说当调用actions。sendkeys(Keys。ALT)、actions。sendkeys(Keys。CONTROL)、action。sendkeys(Keys。SHIFT)的时候,相当于调用actions。keydown(keystosend),而如果在现实的应用中想要模拟按下并且释放这些修饰键,应该先action。resetactions()重设action,然后再调用action。sendkeys(keys。NULL)。perform()取消按下的修饰键。
  第三点,在WebDriver中,我们可以使用WebElement类的sendkeys()来上传附件,比如element。sendkeys(D:estuploadfileest。jpg)上文件,但不能使用ActionChains来上传附件,因为type’file’的输入框并不支持键盘输入。
  2、修饰键的使用
  修饰键是键盘上的一个或者一组特别的键,当它与一般按键同时使用时,用来临时改变一般键盘的普通行为。
  修饰键一般跟普通键组合使用,比如CtrlA、AltF4等。
  我们电脑中的修饰键一般有以下几种修:Ctrl、Alt(Option)、Shift、AltGr、Windowslogo、Command、FN(Function)。一般使用的都是前三种。
  对于修饰键的使用在Pythonselenium中一般使用按下keydown(keys)、释放keyup(keys)、按下并释放sendkeys(keystosend)组合实现。actionActionChains(driver)action。keydown(Keys。CONTROL)。perform()按下ctrl键action。keyup(Keys。CONTROL)。perform()释放ctrl键action。keydown(Keys。SHIFT)。perform()按下shift键action。keyup(Keys。SHIFT)。perform()释放shift键action。keydown(Keys。ALT)。perform()按下alt键action。keyup(Keys。ALT)。perform()释放alt键
  示例:通过ctrlc来复制文本ActionChains(driver)。keydown(Keys。CONTROL)。sendkeys(c)。keyup(Keys。CONTROL)。perform()
  三、WebElement。sendkeys()键盘操作
  WebElement元素对象下的sendkeys也支持组合键盘操作。
  代码示例如下:elementdriver。findelementbyid(query)element。sendkeys(selenium)element。sendkeys(Keys。BACKSPACE)按BACKSPACE删除一个字符element。sendkeys(Keys。SPACE)空格键(Space)element。sendkeys(Keys。CONTROL,a)全选(CtrlA)element。sendkeys(Keys。CONTROL,c)复制(CtrlC)element。sendkeys(Keys。CONTROL,v)粘贴(Ctrlv)element。sendkeys(Keys。TAB)制表键(Tab)element。sendkeys(Keys。ESCAPE)回退键(Esc)element。sendkeys(Keys。ENTER)回车键(Enter)1。6层级定位与定位一组元素
  一、层级定位(二次定位)
  在实际测试过程中,一个页面可能有多个属性基本相同的元素,如果要定位到其中的一个,这时候需要用到层级定位。先定位其父元素,然后再通过父元素定位该元素。
  示例:通过层级定位搜狗输入框driverwebdriver。Chrome()driver。maximizewindow()driver。get(rhttps:www。sogou。com)formelementdriver。findelementbyid(sf)获取form表单元素formelement。findelementbyid(query)。sendkeys(selenium)通过表单定位输入框formelement。findelementbyid(stb)。click()通过表单定位搜索按钮time。sleep(3)driver。quit()
  如上代码,我们先定位到了form表单,然后通过表单定位下面的输入框与按钮。
  注意:上面示例只通过两层定位到了元素,层级定位不一定定位两次,我们可以定位多次。
  二、定位一组元素
  而当我们需要获取多个属性相同的对象,并且需要批量操作该对象时,就会使用findelements定位一组元素。
  创建以下html文件,文件名checkbox。html
  示例:全选上面的多选框fromseleniumimportwebdriverimporttimedriverwebdriver。Chrome()driver。maximizewindow()driver。get(rE:xxxcheckbox。html)打开checkbox。html文件,使用绝对地址checkboxsdriver。findelementsbyxpath(input〔typecheckbox〕)获取批量的对象forcheckboxincheckboxs:循环控制ifnotcheckbox。isselected():判断多选框是否被选中checkbox。click()单击time。sleep(3)driver。quit()
  三、综合运用
  当我们需要定位一组元素时,页面上相似的元素会很多,这时我们需要和层级一定一起使用。先定位到该组元素的父元素,然后通过父元素定位其子孙元素。
  示例1:获取搜狗微信页面搜索热词的内容driverwebdriver。Chrome()driver。maximizewindow()driver。get(rhttp:weixin。sogou。com)topeledriver。findelementbyid(topwords)搜索热词的父元素topstopele。findelementsbytagname(a)二次批量定位热词元素fortopintops:循环获取元素print(top。text)打印文本内容driver。quit()
  UI自动化测试中对于表格的定位是个难点,怎么样快速获取表格数据,请看下面几个示例。
  示例2:定位表格获取表头driverwebdriver。Chrome()driver。maximizewindow()driver。get(rhttp:www。w3school。com。cncssrefcssselectors。asp)table〔classdataintable〕tr〔1〕th获取表头元素tableheaderdriver。findelementsbyxpath(table〔classdataintable〕tr〔1〕th)forheaderintableheader:循环获取元素print(header。text)打印文本内容driver。quit()
  示例3:定位表格第二列数据内容driverwebdriver。Chrome()driver。maximizewindow()driver。get(rhttp:www。w3school。com。cncssrefcssselectors。asp)table〔classdataintable〕tr〔y〕td〔x〕y第几条记录,x第几列数据table〔classdataintable〕trtd〔2〕获取第二列数据tableheaderdriver。findelementsbyxpath(table〔classdataintable〕trtd〔2〕)forheaderintableheader:循环获取元素print(header。text)打印文本内容driver。quit()
  示例4:获取表格中所有的数据driverwebdriver。Chrome()driver。maximizewindow()driver。get(rhttp:www。w3school。com。cncssrefcssselectors。asp)table〔classdataintable〕tr定位所有行tablesdriver。findelementsbyxpath(table〔classdataintable〕tr)fortrintables:循环每行元素fortdintr。findelementsbytagname(td):循环获取列print(td。text,end)print()driver。quit()
  定位表格,采用findelements组定位,使用xpathtabletr〔y〕td〔x〕(y第几条记录,x第几列数据),当y或者x其中一个没有值时定位一行或一列。1。7下拉框元素定位
  选择获取反选下拉框元素首先要实例化select元素
  fromselenium。webdriver。support。uiimportSelect引入包
  selectelementSelect(element)实例化select
  三种常用选择方法
  selectelement。selectbyindex(index)根据index定位,从0开始selectelement。selectbyvalue(value)根据value属性定位selectelement。selectbyvisibletext(text)根据文本定位
  反选的方法
  selectelement。deselectbyindex(index)根据index定位,从0开始selectelement。deselectbyvalue(value)根据value属性定位selectelement。deselectbyvisibletext(text)根据文本定位selectelement。deselectall()取消全部选择
  获取选项的值
  selectelement。options返回这个select元素所有的optionsselectelement。allselectedoptions所有被选中的optionsselectelement。firstselectedoption第一个被选中的option
  创建select。html文件,代码如下:
  示例1:采用三种方法依次选择s1Id的值s1Select(driver。findelementbyid(s1Id))实例化Select,页面第一个下拉框s1。selectbyindex(1)选择第二项选项:o1s1。selectbyvalue(o2)选择valueo2的项s1。selectbyvisibletext(o3)选择texto3的值,即在下拉时我们可以看到的文本
  示例2:想查看一个s1Id所有的选项s1Select(driver。findelementbyid(s1Id))forselectins1。options:print(select。text)
  示例3:查看我已选中的所有选项,s2Id可以多选的选择框s4Select(driver。findelementbyid(s2Id))s4。selectbyindex(1)根据顺序选择第2个s4。selectbyvalue(o2val)根据value属性选择o2vals4。selectbyvisibletext(Withspaces)根据展示文本选择Withspacess4。selectbyvisibletext(uWithnbsp)注意空格,只有为是才用空格forselectins4。allselectedoptions:循环获取所有的值print(select。text)
  注意:只有只有为的空格才是空格,在html中代码只有才代表空格,代码中的空格不是空格。
  示例4:查看选择框的默认值或选中的值s1Select(driver。findelementbyid(s1Id))print(s1。firstselectedoption。text)查看选择默认值s1。selectbyvalue(o2)print(s2。firstselectedoption。text)查看选中的值
  示例5:取消选择s4Select(driver。findelementbyid(s2Id))s4。selectbyindex(1)s4。selectbyvalue(o2val)s4。selectbyvisibletext(Withspaces)s4。selectbyvisibletext(uWithnbsp)s4。deselectbyindex(1)根据值顺序取消选择s4。deselectbyvalue(o2val)根据value属性取消选择s4。deselectbyvisibletext(Withspaces)根据文本取消选择s4。selectbyvalue(o2val)s4。selectbyindex(1)s4。deselectall()取消全部选择1。8定位frame和iframe中的元素对象
  frame

科莫多巨蜥的毒液到底有多可怕?2009年,一名31岁的渔民安瓦尔,在印尼科莫多岛上采摘水果,结果不小心从水果树上掉了下来,刚好踩到了一只巨型蜥蜴,蜥蜴瞬间就朝他扑了过去,咬住了他的腿,之后又咬住了他的手臂,身体武汉未来的房价会涨到100000元平米吗?这个问题的答案是肯定的!以目前的趋势,未来武汉房价必然达到10万的水平,只是时间长短的问题。2010年至2017年,短短七年间,武汉的房价已经翻了3番,目前,武汉部分高端楼盘如洞庭兰州青白石片区,中央公园怎么样?兰州北拓的黄金区域,目前基础交通还跟不上建设需要,交通滞后可能会成为十四五期间兰州青白石片区发展的的最大障碍!不过就兰州地理位置和城区格局而言,青白石片区是离主城区最近的待开发区域农民为什么不在国家统计失业范围之内?中国有四个儿子,大儿子叫工人,二儿子叫子弟兵,三儿子叫公务员,四儿子叫农民,所以四儿子就没有纳入统计失业包括养老金范围,因为四儿子有金山银山还有三分地。农民有土地,这是农民可以赖以农村成立社区是什么意思?很多农村驻有村委会办公室,同时也驻有社区管理委员会办公室,特别是在城市郊区的农村和街道的农村都同时设立了村委会和社区管理委员会,很多人弄不明白是怎么回事。那农村成立社区是什么意思呢农村里的剩男,为何一剩再剩呢?到底是什么原因?男女比例失调。计划生育只要一个孩子时,受封建思想影响,都拚命要男孩,等他们长大了,很难找到媳妇。一,农村姑娘远嫁,二,女孩见少,三,彩礼高,四,剩男挣钱少。我就一大龄剩男!个人亲身抖音付费直播试水,看直播要给钱了?我们应该如何思考?使劲收,最好是家人们看的话,一分钟100块钱。毕竟粉丝听话的很。毕竟人设都设计好了打PK,卖货摆错价格,怒亏2个亿回馈粉丝。没事就怼工厂,怼员工反正就是赔钱回馈粉丝。赔完还得补交税马上就要退休了,退休工资才3650元太少了,怎么办?3600不少了。我企业工龄32年,退休时退休金只有2200,涨了这么多年还不到3000。知足常乐吧!如果身体不好,这些钱也够生活了,如果身体还可以,就找一些力所能及的工作,打打工补南宁五象新区未来的发展潜力很大吗?五象新区无法成为国家级新区!!!目前看来,五象新区的潜力也就这样了。我们对比一下贵阳的贵安新区,贵安新区的面积是1700平方公里,由贵阳市的郊区和安顺市合并得来。是全国第8个国家级如果把三峡大坝加高10米,截留更多的洪水,可行吗?我国的三峡大坝,作为当今世界上最大的水利枢纽工程,位于湖北省宜昌市上游,距下游葛洲坝水电站38公里,三峡大坝全长2309米高185米,呈梯形形状,集发电旅游航运调控洪水于一身。三峡大家有经历过亲人去世吗?是怎样走出痛苦和想念的?2018年9月1日下午3点8分,我的妻子在医院里停止了呼吸。她的眼睛没有闭上,我流着泪,帮她合上了双眼。我永远失去了我最亲近的爱人,孩子永远的失去了妈妈。一位好妻子,好女儿,好姑妈
精艺不止成就全能汽车装调大师刘泗磊2008年7月进入北京长安汽车有限公司工作,现为汽车装调高级技师,国家级技能大师工作室领军人,先后获得全国技术能手中央企业技术能手等荣誉。凭借精湛的技艺,他被客户称为全能汽车一寺八座琉璃塔头条创作挑战赛承德虽然离北京很近,但我上次去是在30多年前,印象都淡漠了。前两年夏天又赴承德一游。承德旅游当然首推避暑山庄,其次是外八庙。外八庙其实不止八个,有十几个,但现在可以游南禅寺佛光寺广仁王庙来山西必看的木结构建筑,个个是珍宝如果你来山西,一定会为这里的古建筑惊叹,在众多古建之中,这里还有你想不到的绝世木构建筑,更为耀眼。唐代建筑南禅寺大殿南禅寺为我国现存最早的唐代木结构建筑之一,它位于忻州五台县东冶镇梦中白鹭乡野飞初春时节,乡村的水田还没插秧,一眼望去,大大小小的水田,像一张张铺开着的画卷,空阔而悠远,散漫而寂寥。牵牛从田埂上或溪水边走过,总能见到惊飞而起的白鹭身影。这些鹭鸟没有白天鹅的高贵冰凌花梦中的花如果说,雪花是一只白色的精灵,给人们带来惊喜和快乐,那么,晶莹剔透的冰凌花,则似银光闪闪的利剑,或是尖刀。在阳光的照射下,像是一排排列队的士兵,在整装待发。或是一把把利刃向天的宝剑泰国第二届珠宝会展推动2023年珠宝出口增长5近日,据泰媒报道称,泰国珠宝及贵金属联合会会长颂猜透露,称联合会和泰国旅游与体育部共同举办了2023第二届泰国珠宝展。此次会展有超过1,300名从业者参与,预计总参会人数将超过10保护野生动物,公安机关盯上动物园马戏团央视网消息打击涉野生动物犯罪专项行动打击重点有哪些?在2月24日公安部举行的新闻发布会上,公安部食品药品犯罪侦查局副局长李剑涛在回答记者提问时表示,公安机关打击重点主要有以下3方面为什么我还是想写张颂文?海风梁静现在称张颂文是内娱顶流,应该没有人有异议吧?张颂文一直是我心中,演技最好的那批演员之一。在狂飙之前,他就有成为顶流的实力,只是狂飙的60亿播放量,让他被更多人看到。这段时间,大大招商首战告捷!常平将打造深莞产业合作区今年是东莞招商年,为加快推动高质量发展,常平新春开年就火力全开拼招商,一把手亲自带队,全力招引龙头产业项目和高潜力专精特新项目,有的放矢,前往深圳开展精准招商。功夫不负有心人。2月吉利银河L7实车亮相,用新车标,车长4700mm,续航可达1370km吉利中高端新能源系列银河来了虽然之前已经有了几何极氪两个主打新能源乘用车的序列,但是吉利又推出了一个全新的新能源系列,吉利银河。近日,吉利银河的首款量产车型,银河L7实车正式亮相。1821年的希腊革命如何改变世界?很少有人意识到1821年希腊革命对在欧洲和世界各地建立民族国家的重要性。1821年的希腊革命是在美国之后,欧洲旧世界第一次成功的自由民族运动,它或多或少与南美洲类似的解放运动同时(
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网