ui自动化笔记selenium_webdriver,ui自动化框架(web)
ui⾃动化笔记selenium_webdriver,ui⾃动化框架(web)
Selenium学习笔记
selenium webdriver是业界公认ui⾃动化测试的标准,其封装的api可以对浏览器的任何地⽅进⾏操作
selenium2.0和selenium3.0的区别?
  3.0任何浏览器的⼚商都⽀持selenium,他们只要给予驱动就可以了,2.0只⽀持⽕狐和⾕歌
webdriver⼯作原理?
  通过webdriver创建⼀个浏览器服务,remote server(底层服务).启动脚本后会通过驱动打开浏览器,并绑定端⼝,不同浏览器端⼝不同
  client端创建⼀个session来请求rmote server并发送restful请求,server解析后,完成代码的操作返回结果
如何定位html中的元素?
  1.查看并分析html中所需定位的元素
  2.到对于当前页⾯来说唯⼀的属性
css selector与xpath区别?
  其有着不同的定位⽅式,择优选择最佳的定位⽅式
  xpath可以通过⾓标定位到⼀些css selector定位不到的元素
  css selector基于html,能快速取到值,xpath底层要从xml转换成html对代码执⾏效率会受到影响,还依赖转化的准确度 
xpath定位  xpath是xml的路径语⾔
  /html/body/div/div/div/ul/li/a[@href="/xpath/xpath_syntax.asp"]  从祖先html开始查定位元素,可以不⽤写⾓标  注意:⼀个/表⽰其⼦元素查,//表⽰模糊匹配查
  //*  获取页⾯所有元素
  //*[@id='xxxx']  @表⽰以id属性定位
  //input[@id='xxx']  input表⽰以input标签名进⾏定位
  //input[1]  如果出现不唯⼀的请求可以通过⾓标的形式取,注意⾓标从1开始
  //input[1]/input[1]  层级定位⽅式,/表⽰当前层级内
  //input[@id='xxx' and @class='xxx']  #逻辑定位⽅法,通过多种属性确⽴唯⼀
  xpath(定位⽅法尽量少⽤层级定位,如果修改了层级位置会导⼊所有定位都失效,以属性定位为主)
css selector定位  html的css选择器标签定位
  #i1  表⽰查id属性为i1的元素
  .i1  表⽰查class属性为i1的属性
  [name='xxx']  表⽰查name属性定位
  input[name='xxx']  可以通过标签名进⾏检索来缩⼩范围
  input#name  查input标签中id为name的元素
  input[name='xxx'][id='xxx'][class='xxx']  input标签下多属性确⽴唯⼀
  input>input[id='xxx']  >表⽰递进⼀层
释然
  input[name^='xxx']  ^⽀持前者模糊匹配
  input[name$='xxx']  $⽀持后者模糊匹配
  input[name*='xxx']  *表⽰包含,只要包含字段中的内容都可能会被匹配上
  css selector不⽀持⾓标取值,所以我们要灵活运⽤xpath和css selector结合
  由于css是html原始⽀持,还可以⽀持很多定位⽅法,以上⼀些我们在⽇常通常都可以⽤了,如进⼀步学习可以参考
selenium webdriver api-代码定位,基础操作
  pip install selenium 
from selenium import webdriver
# 驱动程序,⽤chrome,当然还可以⽤firefox,ie驱动
driver = webdriver.Chrome()
# 获取⽹址
<("www.baidu")
# 设置页⾯宽长
<_window_size()# 获取浏览器的⼤⼩
driver.set_window_size(400, 800)# 定义指定页⾯长宽
driver.maximize_window()#最⼤页⾯长宽
# 截图
<_screenshot_as_file('xx.jpg')# 在当前脚本的同⼀级⽬录⽣成浏览器截屏的图⽚⽂件(其他底层还有三个截图api)
# ⼋种单数定位⽅式(都需要确⽴唯⼀)
driver.find_element_by_name()  #通过name属性定位
driver.find_element_by_id()  #通过id属性定位
driver.find_element_by_class_name()  #通过class属性定位
driver.find_element_by_link_text("")  #⽂案定位
driver.find_element_by_partial_link_text()  #包含⽂案定位
driver.find_element_by_css_selector()  #css selector定位
driver.find_element_by_tag_name()  #标签名定位,如果有多个,获取的是html页⾯中第⼀个
driver.find_element_by_xpath(".//*[@id='kw']").clear()  #xpath定位
# ⼋种复数定位⽅法
  (不常⽤,单数的element加s就是复数,所有复数形式都返回⼀个列表,列表顺序按html从上到下,如果元素下还有⼦元素,可以通过元素进⾏再次定位) # 其他两种定位
  driver.find_element('id','i1')  #单数形式,参数id表⽰通过id定位,i1表⽰元素值为i1进⾏定位
  driver.find_elemnets('id','i1')  #复数形式,返回列表
# 提交表单
driver.find_element_by_xpath(".//[@id='kw']").send_keys("selenium")
driver.find_element_by_xpath(".//*[@id='kw']").submit()
# 控制浏览器前进后退
driver.back()
driver.forward()
# 刷新页⾯
# 浏览器关闭
driver.close() # 关闭⼀个页⾯也叫关闭⼀个tag,当页⾯只有⼀个tag的时候就直接关闭浏览器了教师工作简历范文
driver.quit()  # 退出驱动也就是关闭浏览器
等待,操作浏览器,悬浮
from selenium import webdriver
from selenium.webdrivermon.action_chains import ActionChains  # 引⼊actionchains类
from selenium.webdrivermon.keys import Keys ptions import NoSuchElementException
from time import ctime
from selenium.webdriver.support.select import Select
import time
browser = webdriver.Chrome()  # 打开⽹页驱动
#等待  ⼀般等待分为三种,系统等待,隐⼠等待,显⽰等待
# 隐式等待10s
"""
implicitly_wait():隐式等待
当使⽤了隐⼠等待执⾏测试的时候,如果 WebDriver没有在 DOM中到元素,将继续等待,超出设定时间后则抛出不到元素的异常
换句话说,当查元素或元素并没有⽴即出现的时候,隐式等待将等待⼀段时间再查 DOM,默认的时间是0
⼀旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让⼀个正常响应的应⽤的测试变慢,
它将会在寻每个元素的时候都进⾏等待,这样会增加整个测试执⾏的时间,所以在ui⾃动化实现⽐较鸡肋
"""
browser.implicitly_wait(10)
# 显⽰等待↓
'''
显⽰等待  ==>显⽰等待为selenium的核⼼,⽤好它能增加⾃动化的执⾏速度,提⾼效率
⾃设置了显⽰等待,在设置后到指定设置时间内,会按设置的步长等待,直到到元素或超时
'''
<("www.baidu")  # 打开⽹址
print("设置浏览器宽1200、⾼1400显⽰")
browser.set_window_size(1200, 1400)
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdrivermon.by import By
element = WebDriverWait(browser, 5, 0.5).until( EC.presence_of_element_located((By.ID, "kw")) )
  #browser, 5, 0.5分别表⽰对象,超时时间,步长
  #By.ID,"kw"分别表⽰通过id属性,定位的值
# 系统等待↓
'''
  time.sleep(5)
  系统等待⽤在测试调试阶段
'''
time.sleep(2)
title = browser.title
# title:⽤于获得当前页⾯的标题。
print(title)  # 打印当前页⾯的title
now_url = browser.current_url # 打印当前页⾯URL
# current_url:⽤户获得当前页⾯的URL。
print(now_url)
size = browser.find_element_by_id("kw").size # 到输⼊框的页⾯属性
print(size)
text = browser.find_element_by_id("kw").text # 获取搜索条⽬的⽂本信息
print(text)
attribute = browser.find_element_by_id("kw").get_attribute('type')  # 返回元素属性值
print(attribute)
result = browser.find_element_by_id("kw").is_displayed()  # 查看是否可见
print(result)
browser.find_element_by_id("kw").clear()  # 清除内容
# 如果超出10s抛出异常
qq怎么发信息
try:
print(ctime())
search_test = browser.find_element_by_id("kw").send_keys("seleniuma")  # 输⼊seleniuma
time.sleep(2)
except NoSuchElementException as e:
print(e)
finally:
print(ctime())
# 键盘按键
browser.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
browser.find_element_by_id("su").send_keys(Keys.ENTER)
time.sleep(2)
time.sleep(2)
browser.find_element_by_id("kw").clear()
search_test2 = browser.find_element_by_id("kw").send_keys("webdriver")  # 输⼊webdriver
time.sleep(2)
browser.find_element_by_id('su')  # 提交表单
# ⿏标悬浮
adove = browser.find_element_by_class_name("pf")  # 到adove
ActionChains(browser).move_to_element(adove).perform()  # ⽅法:定位到执⾏元素⿏标悬停操作browser.find_element_by_class_name("setpref").click()  # 到下拉条中元素进⾏点击操作,click:点击事件time.sleep(2)
# 悬停下拉框+显⽰条数
# search03 = browser.find_element_by_link_text("设置")
# ActionChains(browser).move_to_element(search03).perform()
# time.sleep(2)
# 搜索结果显⽰条数
sel = browser.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50')  # 显⽰50条
time.sleep(5)
browser.find_element_by_link_text("保存设置").click()
如何去除家具味道
time.sleep(2)
# 返回原来的样⼦
browser.switch_to.alert.accept()
time.sleep(2)
search03 = browser.find_element_by_link_text("设置")
ActionChains(browser).move_to_element(search03).perform()
time.sleep(2)
av = browser.find_element_by_link_text("搜索设置")
av.click()
time.sleep(2)
browser.find_element_by_id("nr").click()
time.sleep(2)
# 搜索结果显⽰条数
sel = browser.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('10')  # 显⽰10条
# ……
time.sleep(2)
browser.find_element_by_link_text("保存设置").click()
time.sleep(2)
browser.close()
等待扩展
  WebDriverWait参数
def__init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
pass
#driver:类的实例
#timeout:超时时间
poll_frequency=POLL_FREQUENC:#调⽤until或until_not中的⽅法的间隔时间,默认值0.5秒
ignored_exceptions=None:#忽略的异常,如果在调⽤until或until_not的过程中抛出这个元组中的异常,
则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException #以上是构造函数,下⾯介绍⽅法,总共两个until和until_not
def until_not(self, method, message=''):#当某元素消失或什么条件不成⽴则继续执⾏
pass
def until(self, method, message=''):#当某元素出现或什么条件成⽴则继续执⾏
pass
#method:在等待期间,每隔⼀段时间调⽤这个传⼊的⽅法,直到返回值不是False
#message: 如果超时,抛出TimeoutException,将message传⼊异常
  等待操作
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdrivermon.by import By
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
<('www.baidu')
driver.maximize_window()
# 判断某个元素进⼊dom树中,可以是不可见的元素,到返回WebElement对象属性
WebDriverWait(driver, 10, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#kw')))
# 判断某组元素进⼊dom树中,可以是不可见的元素,到返回WebElement对象列表
WebDriverWait(driver, 10, 1).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#kw')))
# 判断title是否正确,返回布尔值
WebDriverWait(driver, 10, 1).until(EC.title_is(u"百度⼀下,你就知道"))
# 包含判断title是否正确,返回布尔值
WebDriverWait(driver, 10, 1).until(EC.title_contains('百度'))
# 判断某个元素是否被加到了dom树⾥,并不代表该元素⼀定可见,如果定位到就返回WebElement
WebDriverWait(driver, 10, 1).until(EC.presence_of_element_located((By.ID, 'kw')))
# 判断是否⾄少有1个元素存在于dom树中,如果定位到就返回列表
WebDriverWait(driver, 10, 1).until(EC.visibility_of_all_elements_located((By.ID, 'kw')))
# 判断某个元素是否可见元旦的诗句
WebDriverWait(driver, 10, 1).until(EC.visibility_of(driver.find_element(by=By.ID, value='kw')))
# 判断某个元素是否别添加到dom⾥并可见,可见代表元素可显⽰且宽和⾼都⼤于0
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((By.ID, 'kw')))
# 判断某个元素是否包含预期字符串,返回布尔值
WebDriverWait(driver, 10, 1)._to_be_present_in_element((By.XPATH, "//*[@id='u1']/a[8]"), u'设置'))
# 判断指定元素的属性值中是否包含预期字符串,返回布尔值
WebDriverWait(driver, 10, 1)._to_be_present_in_element_value((By.CSS_SELECTOR, '#su'), '百度⼀下'))
# 判断该frame是否可以switch进,如果可以返回True并且switch进去,否则返回False
WebDriverWait(driver,10,1).until(EC.frame_to_be_available_and_switch_to_it())
# 判断某个元素中是否可见并且是enable的,代表可点击
WebDriverWait(driver, 10, 1).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='u1']/a[8]"))).click()
# 等待某个元素从dom树中移除WebDriverWait(driver,10,1).until(EC.staleness_of(driver.find_element(By.ID,'su')))
# 判断某个元素是否被选中了,⼀般⽤在下拉列表
WebDriverWait(driver, 10).until(EC.element_to_be_selected(driver.find_element(By.XPATH, "//*[@id='nr']/option[1]")))
# 判断某个元素的选中状态是否符合预期
WebDriverWait(driver, 10).until(
EC.element_selection_state_to_be(driver.find_element(By.XPATH, "//*[@id='nr']/option[1]"), True))
# 判断某个元素的选中状态是否符合预期
WebDriverWait(driver, 10).until(EC.element_located_selection_state_to_be((By.XPATH, "//*[@id='nr']/option[1]"), True)) # 判断页⾯上是否存在alert,如果有就切换到alert并返回alert的内容
instance = WebDriverWait(driver, 10).until(EC.alert_is_present())
⽂件上传,cookie,滚动条,js执⾏
from selenium import webdriver
import time
driver = webdriver.Chrome()
<('sahitest/demo/php/fileUpload.htm')
driver.find_element_by_name("file").send_keys("C:\\Users\\admin\Desktop\\")#选择本地⽂件上传
driver.find_element_by_name("submit").click()
driver.quit()
纤怎么读driver = webdriver.Chrome()
driver.set_window_size(1920,1080)
<("udao")
# 获得cookie信息
cookie = _cookies()
# 将获得cookie的信息打印
print(cookie)
print("向cookie的name 和value中添加会话信息")
driver.add_cookie({'name': 'key-aaaaaaa', 'value': 'value-bbbbbb'})
# 遍历cookies中的name 和value信息并打印,当然还有上⾯添加的信息
for cookie _cookies():
print("%s -> %s" % (cookie['name'], cookie['value']))
<("stclass/selenium_python/javascript/")
#滚动条操作
js = "window.scrollTo(100,700);"#scrollTo(x,y)
#执⾏js代码
time.sleep(3)
driver.quit()
警告框处理
from selenium import webdriver
from selenium.webdrivermon.action_chains import ActionChains
import time
browser = webdriver.Firefox()
browser.implicitly_wait(10)
<("www.baidu")
time.sleep(2)
link = browser.find_element_by_link_text("设置")
ActionChains(browser).move_to_element(link).perform()
browser.find_element_by_link_text("搜索设置").click()
time.sleep(2)
browser.find_element_by_link_text("保存设置").click()
time.sleep(2)
print (browser.switch_to_alert().text)      #先打印再接受警告框
ar = browser.switch_to.alert.accept()        #点击确定警告框
dis = browser.switch_to.alert.dismiss()    #点击取消警告框
browser.quit()
多窗⼝切换
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
<("www.baidu")
# 获取当前对象的窗⼝句柄
sreach_windows = driver.current_window_handle
driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text("⽴即注册").click()
# 获得当前所有打开的窗⼝的句柄,以列表形式返回
all_handles = driver.window_handles
# 进⼊注册窗⼝
for handle in all_handles:
if handle != sreach_windows:#遍历如果不属于之前的那个页⾯就执⾏下⾯操作
driver.switch_to.window(handle)#跳转到另⼀个页⾯
print('now register window!')
driver.find_element_by_name("userName").send_keys('这个是⽤户名')

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。