selenium常见API

元素定位

(1)通过id和name定位
(2)tag name(标签名)和class name
(3)CSS定位(通过copy selector来获取)
(4)XPath定位(通过copy xpath来获取)
(5)link text定位(通过链接定位)
(6)Partial link text定位(通过部分链接定位)

不管用那种方式都需要保证页面上该属性的唯一性。

以下是代码演示各种元素定位的方法:()

#utf-8防止乱码
coding=utf-8
#要使用webdriver中的函数,首先需要把包导进来
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
#########百度输入框的定位方式##########
#通过id 方式定位
browser.find_element_by_id("kw").send_keys("selenium")
#通过name 方式定位
browser.find_element_by_name("wd").send_keys("selenium")
#通过tag name 方式定位
#不能成功,因为input太多了不唯一。
browser.find_element_by_tag_name("input").send_keys("selenium") 
#通过class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
#通过CSS 方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium")
#通过xphan 方式定位
browser.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
############################################
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()

操作测试对象

定位之后需要对定位的元素进行操作
(1)click():点击对象
(2)send_keys(“xxx”):在对象上模拟按键输入
(3)clear():清除输入框内容
(4)submit:提交表单,可以和click()达到相同的效果
(5)text:用于获取元素的文本信息

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# time.sleep(3)

# driver.find_element_by_id("kw").send_keys("虞书欣")
# time.sleep(5)
# driver.find_element_by_id("kw").clear()

# driver.find_element_by_id("kw").send_keys("谢可寅")
# driver.find_element_by_id("su").submit()

#data = driver.find_element_by_name("tj_trnews").text
#print(data)

driver.find_element_by_id("kw").send_keys("乃万")
driver.find_element_by_id("su").submit()

# time.sleep(10)
#智能等待
driver.implicitly_wait(10)
driver.find_element_by_link_text("乃万_百度百科").click()

time.sleep(5)
driver.quit()

添加等待、关闭浏览器

(1)关闭浏览器:

#关闭浏览器
browser.close() 
#不仅关闭浏览器,还会挂掉一些资源(session)
browser.quit() 

(2)等待:

import time
#智能等待:命令完成即可
driver.implicitly_wait()
#普通等待:选择固定的时间等待
time.sleep()

打印信息

印信息
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
# 把页面title 打印出来
print (driver.title) 
#打印url
print (driver.current_url) 
driver.quit()

浏览器的操作

(1)浏览器最大化

browser.maximize_window() 

(2)设置浏览器的宽、高

#设置浏览器宽480,高800显示"
browser.set_window_size(480, 800)

(3)操作浏览器的前进,后退

browser.forward()
browser.back()

(4)控制浏览器的滚动条

#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)

事件

(1)键盘事件
使用前需要先导入keys包

from selenium.webdriver.common.keys import Keys
 #通过send_keys()调用按键\
 #TAB
 send_keys(Keys.TAB)
 #回车
 send_keys(Keys.ENTER)

(2)键盘组合事件

from selenium.webdriver.common.keys import Keys
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')

(3)鼠标事件
ActionChains类
(1)context_click()右击
(2)double_click()双击
(3)drag_and_drop()移动
(4)move_to_element()移动

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")
qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右键
ActionChains(driver).double_click(qqq).perform() #双击
#定位元素的原位置
element = driver.find_element_by_id("s_btn_wr")
#定位元素要移动到的目标位置
target = driver.find_element_by_class_name("btn")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()

(1)ActionChains(driver):生成用户的行为,所有行动都存储在ActionChains对象,通过perform()执行存储的行为。
(2)move_to_element(menu):鼠标移动到一个元素中

定位一组元素

webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。

定位一组元素一般用于以下场景:
(1)批量操作对象,比如将页面上所有的checkbox都勾上
(2)先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个。

from selenium import webdriver
import time
import os
driver = webdriver.Chrome()

#定位一组元素  find_elements
file_path='file:///'+os.path.abspath("E:\\java学习\\JAVA学习资料\\测试\\HTML\\checkbox.html")
driver.get(file_path)
 inputs = driver.find_elements_by_tag_name("input")
 #获取属性值
  get_attribute
 for input in inputs:
     if input.get_attribute('type') == "checkbox":
        input.click()
time.sleep(2)
dr.quit()

get_attribute:获得属性值

多层框架/窗口/层级定位

多层框架

switch_to_frame()
switch_to_frame()把当前定位的主体切换了frame里。怎么理解这句话呢?我们可以从frame的实质去理解。
frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此才需要用switch_to_frame方法去获取frame中嵌入的页面,对那个页面里的元素进行定位。

对于一个现代的web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。

有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中,seelnium webdriver 提供了一个switch_to_frame 方法,可以很轻松的来解决这个问题。

switch_to_default_content: 从frame中嵌入的页面里跳出,跳回到最外面的原始页面中。

多窗口定位:

有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switch_to_window
用法与switch_to_frame 相同:
driver.switch_to_window(“windowName”)

层级定位:

定位思路:
具体思路是:先点击显示出1个下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul 下的某个具体的link。

from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
# 多层框架窗口定位  switch_to.frame()
# 定位内层需从外层一层一层往里定位
# file_path='file:///'+os.path.abspath("E:\\java学习\\JAVA学习资料\\测试\\HTML\\frame.html")
# driver.get(file_path)
# driver.switch_to.frame("f1")
# driver.switch_to.frame("f2")
# driver.find_element_by_id("kw").send_keys("布拉格")
# driver.find_element_by_id("su").click()
# # 从frame中嵌套的页面中跳出,跳回原始的页面
# driver.switch_to.default_content()

# 层级定位
file_path='file:///'+os.path.abspath("E:\\java学习\\JAVA学习资料\\测试\\HTML\\level_locate.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()
# 移动
webdriver.ActionChains(driver).move_to_element(list[0]).perform()
time.sleep(5)
driver.quit() 

WebDriverWait(dr, 10): 10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。dr 就不解释了,前面操作webdriver.firefox()的句柄
is_displayed(): 该元素是否用户可以见

下拉框处理

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框里的选项。

from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
#下拉框处理
file_path = 'file:///' + os.path.abspath(r"E:\\java学习\\JAVA学习资料\\测试\HTML\\drop_down.html")
driver.get(file_path)
time.sleep(4)
# 定位到下拉框
m1 = driver.find_element_by_id("ShippingMethod")
m.find_element_by_xpath("//*[@value='10.69']").click(
m1.find_element_by_xpath("//option[@value='10.69']").click()
time.sleep(3)
m1.find_element_by_xpath("//option[@value='11.61']").click()
time.sleep(5)
driver.quit()

alert、confirm、prompt 的处理

(1)text 返回alert/confirm/prompt 中的文字信息
(2)accept 点击确认按钮
(3)dismiss 点击取消按钮,如果有的话
(4)send_keys 输入值,这个alert\confirm 没有对话

注意: switch_to_alert()只能处理原生的alert

from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
# alert处理
# file_path='file:///'+os.path.abspath(r"E:\\java学习\\JAVA学习资料\\测试\HTML\\alert.html")
# driver.get(file_path)
# # 点击链接,弹出alert
# driver.find_element_by_id("tooltip").click()
# time.sleep(2)
# # 跳转到alert
# # 注意:alert= driver.switch_to.alert()是错误的
# alert= driver.switch_to.alert
# # 打印出alert框的内容
# # print (alert.text)
# # 点击确认按钮,接受警告信息
# # alert.accept()
# # 点击取消按钮,也可以取消alert框
# # alert.dismiss()
#send—_keys
file_path='file:///'+os.path.abspath("E:\\java学习\\JAVA学习资料\\测试\\HTML\\send.html")
driver.get(file_path)
driver.find_element_by_tag_name("input").click()
alert = driver.switch_to.alert
alert.send_keys("python")
time.sleep(3)
alert.accept()
time.sleep(5)
driver.quit()

DIV对话框处理

更多的时候我们在实际的应用中碰到的并不是简单警告框,而是提供更多功能的会话框。

from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
# div对话框处理
file_path = 'file:///' + os.path.abspath(r"E:\\java学习\\JAVA学习资料\\测试\HTML\\modal.html")
driver.get(file_path)
driver.find_element_by_id("show_modal").click()
time.sleep(4)
driver.find_element_by_class_name("modal-body").find_element_by_id("click").click()
time.sleep(4)
#如果只有一个button组就可以直接定位,否则要先定位到相应的div
but = driver.find_elements_by_tag_name("button")
but[0].click()
buttons=driver.find_element_by_class_name("modal-footer").find_elements_by_tag_name("button")
buttons[0].click()
time.sleep(4)
driver.quit()

文件上传操作

from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
# 文件上传操作
file_path = 'file:///' + os.path.abspath(r"E:\\java学习\\JAVA学习资料\\测试\HTML\\upload.html")
driver.get(file_path)
time.sleep(3)
driver.find_element_by_name("file").send_keys(r"E:\\java学习\\JAVA学习资料\\测试\HTML\\alert.html")
time.sleep(4)
driver.quit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值