自动化测试_Python_Selenium_1_基础学习笔记

Selenium 环境配置

  • where python 查看自己电脑上python的安装目录;
  • pip install selenium 指令安装selenium;
  • 浏览器驱动安装(由于执行的脚本需要浏览器驱动来驱动浏览器,所有需要先安装相应的浏览器驱动);
  • WebDriver支持Firefox、IE、Opera、Chrome等浏览器;
  • 浏览器驱动下载:https://www.selenium.dev/documentation/en/getting_started_with_webdriver/third_party_drivers_and_plugins/
    在这里插入图片描述
    在这里插入图片描述
  • 把驱动添加至系统环境变量Path下,或添加至python 安装根目录下(因为Python已添加至系统环境变量中);

webdriver API

1.页面元素定位、操作

页面元素:浏览器上能显示的所有要素,如图片、文本框、按钮、下拉列表、视频等。

自动化测试的主要步骤:

  • 通过某些方式定位到我们要执行的对象、目标;
  • 对这个对象进行什么操作(command);
  • 通过操作对定位到的元素进行赋值(value);
  • 添加断言操作;

WebDriver定位元素的9种方式及操作:-----------学习链接
①、id属性定位---------->driver.find_element_by_id(“id属性值”);
②、name属性定位----------------->driver.find_element_by_name(“name属性值”);
③、class name 属性定位--------->driver.find_element_by_class_name(“类名”);
④、link test属性定位------------->find_element_by_link_text(“链接显示的文本”)

# 文字完全匹配定位
driver.find_element_by_link_text("学术").click()
# 文字部分匹配定位
driver.find_element_by_partial_link_text("论文").click()

⑤、tag name属性定位----------------->find_element_by_tag_name(“标签名”);

# 方式1:定位指定页面上input标签的元素(自上而下找到第1个input)
driver.find_element_by_tag_name("input").send_keys("Selenium")
# 方式2:定位所有input标签中指定的某一个input(此处[0]代表第1个input标签)
# 以下需要用elements,因为是对页面上的所有input标签形成集合
driver.find_elements_by_tag_name("input")[0].send_keys("Selenium")

⑥、partial link test(类似link test)------------->find_element_by_partial_link_text(“部分链接显示的文本”);
⑦、xpath--------------->find_element_by_xpath(“xpath”)

XPath:即XML路径语言,是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
获取属性的路径:获取元素的绝对路径/相对路径

					//* ------->表示所有标签
利用元素属性定位: //input[@id='kw'] ------->表示找到id = kw 的input 标签;
				//input[@class = '??']------>找到class  = ?? 的input 标签
利用父子关系以及属性定位:先定位父亲位置,再定位儿子位置  //*[@id='form']/span[1]/span
利用逻辑运算符:通过一个元素无法定位,有重复的,可用两个或多个来定位
		//input[@id = '1' and @name = '2']--->表示找到id=1并且name=2input标签
driver.get("https://www.baidu.com")
# 根据XPath绝对路径定位到Baidu输入框中的相机按钮,并点击之
driver.find_element_by_xpath("//*[@id='form']/span[1]/span").click()
sleep(3)
# 根据XPath相对路径定位到上传图片的链接输入框,并输入设定的url字符串
driver.find_element_by_xpath("//*[@id='soutu-url-kw']").send_keys("www.baidu.com")
sleep(3)
# 根据XPath绝对路径定位到上传图片弹框的关闭按钮,并点击之
driver.find_element_by_xpath("//*[@id='form']/div/a").click()

⑧、css------------------>find_element_by_css_selector();

Selenium极力推荐使用CSS定位,而非XPath来定位元素,原因是CSS定位比XPath效率高速度快,语法也更加简洁。

  • find_element_by_css_selector()
  • #id (id选择器,根据id属性来定位元素,#作为id的标志)
  • .class (class选择器,根据class属性值来定位元素,.作为class [css类] 的标志)
  • [attribute='value'] (根据属性来定位元素)
  • element > element (根据元素层级来定位: 父元素>子元素)
# 根据元素层级来定位
driver.find_element_by_css_selector("#form > span.bg.s_ipt_wr.quickdelete-wrap > span").click()
driver.find_element_by_css_selector("#form > div > a").click()
sleep(2)
# 根据id来定位
driver.find_element_by_css_selector('#kw').send_keys("Python")
# 根据class定位
driver.find_element_by_css_selector('.s_ipt').send_keys("自动化测试")
# 根据属性来定位
driver.find_element_by_css_selector("[autocomplete='off']").send_keys("Selenium")
driver.find_element_by_id('su').click()
webdriver常用方法
  • 清除文本:clear()
  • 模拟按键输入:send_keys(*value)
  • 单击元素:click()
  • 提交表单(相当于"回车"):submit()
  • current_url : 返回当前页面的 url 地址
  • title : 返回当前页面的title
  • text : 获取页面(提示框、警告框)显示的文本
  • get_attribute(name) : 获取属性值,文本框理的值使用 value 属性名
  • is_displayed() : 设置该元素是否用户可见-----布尔属性
  • is_enabled() : 是否可用-----布尔属性
  • is_selected() : 判断是否选中-----布尔属性
2.浏览器操作-------对driver的操作
  • windowHandle: 一个页面的标识
  • 加载浏览器驱动: webdriver.Firefox()
  • 打开页面:get(“url”)
  • 最大化窗口: maximize_window()
  • 最小化窗口:minimize_window()
  • 设置窗口参数:set_window_size(600,800)
  • 后退到前一页: back()
  • 前进到后一页: forward()
  • 刷新页面: refresh()
  • 当前页面的截屏:save_screenshoot(“截图保存路径及名称:E:\a.png”)
  • 将截屏按照规定格式存储:get_screenshoot_as_file()
  • 关闭浏览器:quit()不管存在几个页面,均关闭
  • 关闭窗口:close() 只管一个窗口,而且是前一个
3.鼠标、键盘操作
①鼠标(ActionChains类中)
ActionChains(driver).double_click(DoubleClick).perform()#双击
ActionChains(driver).context_click(RightClick).perform()#右击
ActionChains(driver).drag_and_drop(Start, End).perform()#拖放
ActionChains(driver).move_to_element(Above).perform()#悬停
ActionChains(driver).click_and_hold(leftclick).perform()#按下
②键盘(Keys类中)
send_keys(Keys.BACK_SPACE)           # BackSpace   删除键
send_keys(Keys.SPACE)                # Space    空格键
send_keys(Keys.TAB)                  # Tab      制表键
send_keys(Keys.ESCAPE)               # Esc    ESC键
send_keys(Keys.ENTER)                # Enter      回车键
send_keys(Keys.CONTROL,‘a’)          # Ctrl+A   全选
send_keys(Keys.CONTROL,‘c’)          # Ctrl+C   复制
send_keys(Keys.CONTROL,‘x’)          # Ctrl+X   剪切
send_keys(Keys.CONTROL,‘v’)          # Ctrl+V   粘贴
send_keys(Keys.F1)                   # 键盘F1    
4.警告窗口处理
  • switch_to_alert() 或 switch_to.alert:警告框处理,暂时将浏览器对象driver交给alert
  • text:返回所有alert/confirm/prompt中的文字信息
  • accept():接受现有警告框
  • dismiss():解散现有警告框
  • send_keys(keysToSend):发送文本至警告框
5.多窗口、多表单处理
①多窗口
  • 当前句柄:current_window_handle--------->返回的是当前driver绑定的那个窗口
  • 所有句柄:window_handles------------------>返回浏览器中打开的所有窗口,一个数组
  • 多窗口切换:switch_to.window()------------------>参数给指定窗口的句柄即可
②多表单
  • 多表单切换:switch_to.frame()
6.设置元素等待
①强制等待:
  • time.sleep(n):单位是秒,直接让线程休眠
②隐式等待
  • driver.implicity_wait(n):全局等待时间。在等待时间n s内,定位到了元素,就不再等待继续执行接下来的代码;若在等待时间内,未定位到,则抛出异常
③显示等待
  • WebDriverWait(四个参数).until( method, message)------>显示等待,直到满足一个条件,返回。
  • WebDriverWait(**driver, timeout, poll_frequency=0.5, ignored_exceptions=None**).until( EC.条件实现((By类定位方式, 定位值), message))

显示等待:主要正对某个元素,在规定时间内,可见、可点击、等等,超出时间则抛出异常
隐士等待:主要正对整个页面,在规定时间内,整个页面加载完成,才执行下一步,超出时间则抛出异常
显示等待和隐士等待同时存在时,看谁的时间长,就取谁的等待时间

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

base_url = "http://www.baidu.com"
driver = webdriver.Firefox()
driver.implicitly_wait(5)
'''隐式等待和显示等待都存在时,超时时间取二者中较大的'''
locator = (By.ID,'kw')
driver.get(base_url)

WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
'''判断title,返回布尔值'''

WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))
'''判断title,返回布尔值'''

WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
'''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement'''

WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))
'''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0'''

WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))
'''判断元素是否可见,如果可见就返回这个元素'''

WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))
'''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表'''

WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))
'''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''

WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'设置'))
'''判断指定的元素中是否包含了预期的字符串,返回布尔值'''

WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下'))
'''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值'''

#WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))
'''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''
#注意这里并没有一个frame可以切换进去

WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))
'''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''
#注意#swfEveryCookieWrap在此页面中是一个隐藏的元素

WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()
'''判断某个元素中是否可见并且是enable的,代表可点击'''
driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()
#WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click()

#WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))
'''等待某个元素从dom树中移除'''
#这里没有找到合适的例子

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))
'''判断某个元素的选中状态是否符合预期'''
driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

instance = WebDriverWait(driver,10).until(EC.alert_is_present())
'''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''
print instance.text
instance.accept()

driver.close()
7.cookie处理:
  • get_cookies():获得所有cookie信息
  • get_cookie(name):返回字典的key为“name”的cookie信息
  • add_cookie(cookie_dict):添加cookie。“cookie_dict”指字典对象,必须有name和value值
  • delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”
  • delete_all_cookies():删除所有cookie信息
  • 生成随机数:radint()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值