unittest详解(三) 简单元素定位
一、8种简单对象定位属性:
- · id
- · name
- · class name
- .tag name
- · link text
- · partial link text
- · xpath
- · css selector
这8种定位方式在Python selenium中所对应的方法为:
- find_element_by_id()
- find_element_by_name()
- find_element_by_class_name()
- find_element_by_tag_name()
- find_element_by_link_text()
- find_element_by_partial_link_text()
- find_element_by_xpath()
- find_element_by_css_selector()
定位方法:
webdriver可以很方便的使用findElement方法来定位某个特定的对象,如果需要定位一组对象,这时候就需要使用findElements方法。
层级定位:
# coding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait import time import os dr = webdriver.Chrome() file_path = 'file://' + os.path.abspath('test.html') dr.get(file_path) #点击Link1链接(弹出下拉列表) dr.find_element_by_link_text('Link1').click() #找到id 为dropdown1的父元素 WebDriverWait(dr, 10).until(lambda the_driver: the_driver.find_element_by_id('dropdown1').is_displayed()) #在父亲元件下找到link为Action的子元素 menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action') #鼠标定位到子元素上 webdriver.ActionChains(dr).move_to_element(menu).perform() time.sleep(2) dr.quit()
定位思路:
具体思路是:先点击显示出1个下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul下的某个具体的link。在这里,我们定位第1个下拉菜单中的Action这个选项。
WebDriverWait(dr, 10) 10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。
is_displayed() 该元素是否用户可以见
ActionChains(driver) 生成用户的行为。所有的行动都存储在actionchains对象。通过perform()存储的行为。
move_to_element(menu) 移动鼠标到一个元素中,menu上面已经定义了他所指向的哪一个元素。
to_element:元件移动到。
perform() 执行所有存储的行为
“下拉列表中Action选项处于被选中状态”,通过鼠标移动到选项上就达到到了这种效果,但通过程序模拟确实比较麻烦
基础操作:
self.driver.implicitly_wait(30) driver.maximize_window() #窗口最大化 #driver.set_window_size(1366, 768) #参数数字为像素点 driver.switch_to_window(driver.window_handles[1]) #此行代码用来定位当前页面 title=driver.title # 获取页面title url = driver.current_url #获取当前页面url. browser.back() browser.forward()
智能等待:
implicitly_wait() 它的用法应该比time.sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
二、简单元素操作:
- · click() 点击对象
- · send_keys('xxxx') 在对象上模拟按键输入
- · clear() 清除对象的内容,如果可以的话
三、WebElement 接口操作:
- · text 获取该元素的文本
- .size #获取元素的大小
- .title #获取网页title
- · submit() 提交表单
- · get_attribute('xxxx') 获得属性值
- .s_selected(self) #元素是否被选择
- .is_enabled() #元素是否被启用
- .find_element_by_id("kw").is_displayed() #获取元素是否可见,值为True或False
四、鼠标操作:双击,鼠标右键,鼠标移动,拖动到元素上等操作:
ActionChains(driver):存储鼠标的操作
perform():对指定的鼠标操作的执行
右击图标:
from selenium.webdriver.common.action_chains import ActionChains imei=driver.find_element_by_css_selector(" ").click() ActionChains(driver).context_click(imei).perform() #鼠标右键 ActionChains(driver).click_and_hold("imei").perform() #鼠标左键 ActionChains(driver).double_clcik("imei").perform() #鼠标双击 ActionChains(driver).move_to_element("imei").perform() #鼠标移动到某个元素上 ActionChains(driver).drag_and_drop(start,end).perform() #鼠标拖动某个元素从start位置到end的位置
五、键盘操作:
键盘的操作基于send_keys()方法
from selenium.webdriver.common.Keys import Keys driver.find_element_by_id("kw").send_keys(KEY.BACK_SPACE) #删除键 driver.find_element_by_id("kw").send_keys(KEY.ENTER) #回车键 driver.find_element_by_id("kw").send_keys(KEY.SPACE) #空格键 driver.find_element_by_id("kw").send_keys(KEY.TAB) #制表符 driver.find_element_by_id("kw").send_keys(KEY.ESCAPE) #退出键 driver.find_element_by_id("kw").send_keys(KEY.CONTROL,'a') #全选 driver.find_element_by_id("kw").send_keys(KEY.CONTROL,'c') #复制 driver.find_element_by_id("kw").send_keys(KEY.CONTROL,'v') #粘贴 driver.find_element_by_id("kw").send_keys(KEY.CONTROL,'x') 剪切
六、下拉框multiple select:
from selenium.webdriver.support.ui import Select # 首先找到需要选择的multiple select元素,实例化一个Select类 select = Select(self.driver.find_element_by_xpath('//*[@id="Root_sourcetype"]')) select.deselect_all() # multiple select元素全部取消选择 select.select_by_index(0) # 选择multiple select元素中第一个选项 select.select_by_value("test") #选择下拉框value为test的选项 select.select_by_visible_text("测试") # 通过选项文字进行选择
七、多层框架定位
有些页面的框架嵌套着另一个框架,如果需要定位被嵌套的框架里的内容则可以先定位到外部框架,再定位到被嵌套的框架,然后就可以定位里面的页面元素,其实这个思路和定位层级元素是一样的,只是这里用到定位框架的语句需要记下
switch_to_frame(id)
例如:框架A嵌套这框架B,现在需要定位框架B中的文本框
switch_to_frame(id = a) switch_to_frame(id = b) find_element_by_id("textboxid")
定位弹出的框架后操作完成需要跳出框架才可以定位原先页面上的元素。
driver.switch_to_frame("layui-layer-iframe1") #定位框架 driver.switch_to_default_content() 跳出框架
switch_to.default_content() #跳回最外层的页面 driver.find_element_by_xpath("html/body")
八、多层窗口定位
浏览器窗口的切换通过句柄(handle)来操作,每个窗口都有一个句柄,代表当前窗口,需要操作哪个页面的窗口,切换到窗口对应的句柄。
打开多个页面时,分别获取对应handle值,通过handle进行切换页面:
#定位当前页面:
handle1=driver.current_window_handle
switch_to_window( handle1)
#同一个浏览器多个窗口,指定定位到第一个浏览器窗口:
handle2=driver.window_handles[0]
switch_to_window(handle2)
#获取所有页面的句柄:hs=driver.window_handles
九、JS弹出对话框
在实际系统中,在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框。
1.警告消息框(alert)
警告消息框提供了一个"确定"按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说用户必须先关闭该消息框然后才能继续进行操作。
2.确认消息框(confirm)
确认消息框向用户提示一个"是与否"问题,用户可以根据选择"确定"按钮和"取消"按钮。
3.提示消息对话(prompt)
selenium 提供switch_to_alert()方法定位到 alert/confirm/prompt对话框。使用 text/accept/dismiss/send_keys 进行操作,这里注意的是send_keys只能对prompt进行操作。
alert = driver.switch_to_alert() #定位弹出对话 print (alert.text) #打印警告对话框内容 alert.accept() 或alert.dismiss() #相当于点击"确认"或取消.
十、JS滚动条
scrollTo函数:不存在兼容性问题。
--scrollHeight 获取对象的滚动高度。
--scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。
--scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。
--scrollWidth 获取对象的滚动宽度。
## 回到顶部
def scroll_top():
if driver.name == "chrome":
js = "var q=document.body.scrollTop=0"
else:
js = "var q=document.documentElement.scrollTop=0"
return driver.execute_script(js)
#拉到底部
def scroll_foot():
if driver.name == "chrome":
js = "var q=document.body.scrollTop=10000"
else:
js = "var q=document.documentElement.scrollTop=10000"
return driver.execute_script(js)
#滚动到底部
js = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js)
#滚动到顶部
js = "window.scrollTo(0,0)"
driver.execute_script(js)
# 通过javascript设置浏览器窗口的滚动条位置 js="window.scrollTo(100,450);" driver.execute_script(js)
# 聚焦元素
target = driver.find_element_by_xxxx()
driver.execute_script("arguments[0].scrollIntoView();", target)
十一、input标签文件上传
input标签是可以直接send_keys.
self.driver = webdriver.Chrome()
driver.find_element_by_css_selector("#uploadTask").send_keys("G:/data.xlsx")