自动化测试-----WebDriver API

一、从定位元素开始
WebDriver提供了八种元素定位方法:
1、id 2、name 3、class name 4、tag name 5、link text 6、partial link text 7、XPath 8、css selector 在Python语言中,对应的定位方法如下:
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()

XPath定位
1)XPath可以通过 写出元素的绝对路径,即:绝对地址
2)XPath也可通过元素属性值来定位
find_element_by_xpath(“//input[@ id =’kw’]”)
//表示当前页面某个目录下,input表示定位元素的标签名,[@ id=’kw‘]表示这个元素的id属性值等于kw
3)XPath也可通过层级与属性相结合
4)XPath也可通过逻辑运算符连接多个属性来查找元素

CSS定位
1)通过CSS属性定位: .(点号)表示通过class属性来定位元素
2)通过id属性定位:(#)井号表示通过id属性来定位元素
3)通过标签名定位 :如: input
4)通过父子关系定位
find_element_by_css_selector(“span>input”) 表示有父亲元素,它的标签名为span,查找它的所有标签名叫input的子元素
5)通过属性定位:
find_element_by_css_selector(“[autocomplete=off]”)
6)组合定位
XPath与CSS定位方式对比

定位XPathCSS
标签 //div div
By id //div[@id=’eleid’] div #eleid
By class //div[@class=’eleclass’] div.eleclass
By属性 //div[@title=’move mouse here’] div[title=move mouse here] div[title^=move] div[title$=here] div[title*=mouse]
定位子元素 //div[@id=’eleid’]/* //div/h1 div#eleid>* div>h1

二、控制浏览器
一)控制浏览器大小
WebDriver提供了set_window_size()方法来设置浏览器大小
浏览器在全屏模式下,可以使用maximize_window()方法使打开的浏览器全屏显示,其用法与set_window_size()相同,但它不需要参数

from selenium import webdriver
from time import *
driver=webdriver.Firefox()
driver.get("https://www.baidu.com/")
print("设置浏览器宽480,高800显示")
driver.set_window_size(480,800)
sleep(5)
driver.maximize_window()
sleep(5)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

二) 控制浏览器的前进与后退
WebDriver提供back( )和forward()方法来模拟后退和前进按钮

from selenium import webdriver
from time import *
driver=webdriver.Firefox()
first_url='https://www.baidu.com/'
print("now access %s"%first_url)
driver.get(first_url)

second_url='http://news.baidu.com/'
print("now access %s"%second_url)
driver.get(second_url)

driver.back()
print("now access %s"%first_url)
sleep(5)

driver.forward()
print("now access %s"%second_url)
sleep(5)

driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果:
这里写图片描述

三)控制浏览器刷新
在使用浏览器浏览网页时,浏览器需要刷新来浏览最新的数据,可以手动刷新(F5)页面,WebDriver提供对应refresh()方法来模拟刷新。

from selenium import webdriver
from time import *
driver=webdriver.Firefox()

first_url='https://www.baidu.com/'
print("now access %s"%first_url)
driver.get(first_url)

second_url='http://news.baidu.com/'
print("now access %s"%second_url)
driver.get(second_url)

driver.back()
print("now access %s"%first_url)
sleep(5)

driver.forward()
print("now access %s"%second_url)
sleep(5)

driver.refresh()
sleep(5)

driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

三、简单元素操作
定位元素后,需要对该元素进行操作或单击(按钮)或输入(输入框),WebDriver中常用的方法:
clear() :清除文本
send_keys(* value) : 模拟按键输入
click():单击元素

一)126邮箱登陆方式

from selenium import webdriver
from time import *
driver=webdriver.Firefox()

first_url='https://mail.126.com/'
driver.get(first_url)


driver.switch_to_frame("x-URS-iframe")
driver.find_element_by_xpath("//input[@class='j-inputtext dlemail']").clear()
driver.find_element_by_xpath("//input[@class='j-inputtext dlemail']").send_keys("输入具体用户名")

driver.find_element_by_xpath("//input[@class='j-inputtext dlpwd']").clear()
driver.find_element_by_xpath("//input[@class='j-inputtext dlpwd']").send_keys("输入对应的密码")

driver.find_element_by_id("dologin").click()

sleep(5)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

二)WebElement 接口常用方法
通常需要与页面交互的方法都由WebElement接口提供,包括上面的8中定位方法和刚才的3中方法。除此之外,WebElement还提供了如下方法:
submit() 用于提交表单。如:在搜索框输入关键字之后的“回车”操作,就可以通过submit()方法模拟。

from selenium import webdriver
from time import *
driver=webdriver.Firefox()

first_url='http://www.youdao.com/'
driver.get(first_url)

driver.find_element_by_id("translateContent").send_keys("hello")
driver.find_element_by_xpath("//*[@id='form']/button").submit()

sleep(5)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

size :返回元素的尺寸
text:获取元素的文本
get_attribute(name):获取属性值
is_displayed():判断该元素是否用户可见

from selenium import webdriver
from time import *
driver=webdriver.Firefox()

driver.get("https://www.baidu.com/")
size=driver.find_element_by_id("kw").size
print(size)

text=driver.find_element_by_id("cp").text
print(text)

result=driver.find_element_by_id("kw").is_displayed()
print(result)

sleep(5)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

四、鼠标事件
ActionChains类提供了鼠标操作的常用方法:
click(on_element=None)——–单击鼠标左键
click_and_hold(on_element=None)——–单击鼠标左键,不松开
context_click(on_element=None)——–单击鼠标右键
double_click(on_element=None)——–双击鼠标左键
drag_and_drop(on_element=None)——–拖拽到 某个元素后松开
drag_and_drop_by_offset(source,xoffset,yoffset)——–拖拽到 某个坐标后 松开
move_by_offset(xoffset,yoffset)——–鼠标从当前位置移动到某个坐标
move_to_element(to_element)——–鼠标移动到某个元素
drag_and_drop_by_offset(source,xoffset,yoffset)——–拖拽到 某个坐标后 松开
move_to_element_with_offset(to_element,xoffset,yoffset)——–移动到距离某个元素(左上角坐标)多少距离的位置
perform()——–执行链中的所有动作
release(on_element=None)——–在某个元素位置松开鼠标左键
send_keys(*keys_to_send)——–发送某个键到当前焦点的元素
send_keys_to_element(element,*keys_to_send)——–发送某个键到指定元素

一)鼠标右击操作
假如:目标网址:http://sahitest.com/demo/clicks.htm

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import *
driver=webdriver.Firefox()

driver.get("http://sahitest.com/demo/clicks.htm")
driver.implicitly_wait(10)

rightclick_btn=driver.find_element_by_xpath("html/body/form/input[4]")

ActionChains(driver).context_click(rightclick_btn).perform()
print(driver.find_element_by_name("t2").get_attribute("value"))

sleep(5)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

二)鼠标悬停与移动
鼠标悬停弹出下拉菜单也是一个十分常见的功能设计
move_to_element()方法可以模拟鼠标悬停的动作,其用法与context_click()相同

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import *
driver=webdriver.Firefox()

driver.get("http://sahitest.com/demo/clicks.htm")
driver.implicitly_wait(10)

rightclick_btn=driver.find_element_by_xpath("html/body/form/input[4]")

ActionChains(driver).move_to_element(rightclick_btn).perform()

sleep(5)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

假如:目标网址:http://sahitest.com/demo/mouseover.htm

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import *
driver=webdriver.Firefox()

driver.get("http://sahitest.com/demo/mouseover.htm")
driver.implicitly_wait(10)
driver.maximize_window()

write=driver.find_element_by_xpath("html/body/form/input[1]")

blank=driver.find_element_by_xpath("html/body/form/input[2]")

result=driver.find_element_by_name("t1")

action=ActionChains(driver)

action.move_to_element(write).perform()
print(result.get_attribute("value"))
sleep(5)

#action.move_to_element(blank).perform()
action.move_by_offset(10,50).perform()
print(result.get_attribute("value"))
sleep(5)

action.move_to_element_with_offset(blank,10,-40).perform()
print(result.get_attribute("value"))

sleep(5)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

三)鼠标双击操作
double_click()方法用于模拟鼠标双击操作。
目标网址:http://sahitest.com/demo/clicks.htm

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import *
driver=webdriver.Firefox()

driver.get("http://sahitest.com/demo/clicks.htm")
driver.implicitly_wait(10)
driver.maximize_window()

doubleclick_btn=driver.find_element_by_xpath("html/body/form/input[2]")
action=ActionChains(driver)
action.double_click(doubleclick_btn).perform()
print(driver.find_element_by_name("t2").get_attribute("value"))

sleep(5)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

四)鼠标拖放操作
drag_and_drop(source,target)在源元素上按住鼠标左键,然后移动到目标元素上释放。
source:鼠标拖动的源元素
target:鼠标释放的目标元素
目标网址:http://sahitest.com/demo/dragDropMooTools.htm

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import *
driver=webdriver.Chrome()

driver.get("http://sahitest.com/demo/dragDropMooTools.htm")
driver.implicitly_wait(10)
#driver.maximize_window()

dragger=driver.find_element_by_id("dragger")

item1=driver.find_element_by_xpath("html/body/div[2]")

item2=driver.find_element_by_xpath("html/body/div[3]")

item3=driver.find_element_by_xpath("html/body/div[4]")

item4=driver.find_element_by_xpath("html/body/div[5]")

action=ActionChains(driver)
action.drag_and_drop(dragger,item1).perform()
sleep(5)

action.click_and_hold(dragger).release(item2).perform()
sleep(5)

action.drag_and_drop_by_offset(dragger,300,150).perform()
sleep(5)

action.click_and_hold(dragger).move_by_offset(400,100).perform()
sleep(5)

driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

五、键盘事件
Keys()类提供了键盘上几乎所有按键的方法,前面,send_keys()可以用来模拟键盘输入,除此之外,还可以用它来输入键盘上的按键,甚至是组合键
key_down(value,element=None)———-按下某个键盘上的键
key_up(value,element=None)———-松开某个键
常用的键盘操作:
send_keys(Keys.BACK_SPACE) ——删除键(backspace)
send_keys(Keys.SPACE)———— 空格键(space)
send_keys(Keys.TAB) ———-制表键(Tab)
send_keys(Keys.ESCAPE)———-回退键(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
……..
send_keys(Keys.F12)———— 键盘F12

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from time import *
driver=webdriver.Firefox()

driver.get("https://www.baidu.com")
driver.implicitly_wait(10)

driver.find_element_by_id("kw").send_keys("seleniumm")
sleep(5)

driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
sleep(5)

driver.find_element_by_id("kw").send_keys(Keys.SPACE)
sleep(5)

driver.find_element_by_id("kw").send_keys("教程")
sleep(5)

driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"a")
sleep(5)

driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"x")
sleep(5)

driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"v")
sleep(5)

driver.find_element_by_id("kw").send_keys(Keys.ENTER)
sleep(5)

driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

目标网址:http://sahitest.com/demo/keypress.htm

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from time import *
driver=webdriver.Firefox()

driver.get("http://sahitest.com/demo/keypress.htm")
driver.implicitly_wait(10)
driver.maximize_window()
action=ActionChains(driver)

key_up_radio=driver.find_element_by_id("r1")
key_down_radio=driver.find_element_by_id("r2")
key_press_radio=driver.find_element_by_id("r3")
enter=driver.find_element_by_xpath("html/body/form/input[2]")
result=driver.find_element_by_xpath("html/body/form/input[1]")

key_down_radio.click()
action.key_down(Keys.CONTROL,enter).key_up(Keys.CONTROL,enter).perform()
print(result.get_attribute("value"))
sleep(5)

key_up_radio.click()
enter.click()
action.key_down(Keys.SHIFT).key_up(Keys.SHIFT).perform()
print(result.get_attribute('value'))
sleep(5)

key_press_radio.click()
action.send_keys("a").perform()
print(result.get_attribute('value'))
sleep(5)

driver.quit()
posted @ 2021-01-04 18:37  气泡水  阅读(109)  评论(0编辑  收藏  举报