一个简单自动化脚本的构成:
打开百度搜索selenium
- # coding = utf-8 设置编码模式
- from selenium import webdriver # 导入webdriver工具包,这样就可以使用里面的API
- import time
- browser = webdriver.Firefox() # 获取浏览器(Firefox)驱动
- time.sleep(3) # 休息3秒
- browser.get("http://www.baidu.com")
- time.sleep(3)
- browser.find_element_by_id("kw").send_keys("selenium") # 定位元素“kw” 输入selenium
- time.sleep(3)
- browser.find_element_by_id("su").click() # 定位元素“su” click点击
- browser.quit() # 关闭浏览器
UI测试:界面上进行元素的操作 先定位元素,再去操作元素
browser.quit() 退出并关闭窗口.清理浏览器的缓存,更好的释放资源
browser.close() 也可以关闭窗口
定位元素的原则,不管用什么方式定位,这个方式(tag_name,name,id等)必须全局唯一
- # 定位元素的方式
- from selenium import webdriver
- import time
-
- driver = webdriver.Chrome()
- driver.get("https://www.baidu.com/")
- time.sleep(3)
-
- # # 通过 id 来定位 全局唯一,可以唯一定位一个元素
- # # 锁定位置 输入梦华录send_keys("梦华录")
- # driver.find_element_by_id("kw").send_keys("梦华录")
- # time.sleep(3)
- # # 锁定位置 点击click()
- # driver.find_element_by_id("su").click()
-
- # # 通过name来定位
- # driver.find_element_by_name("wd").send_keys("赵盼儿")
- # driver.find_element_by_id("su").click()
-
- # # 通过 tag_name定位
- # driver.find_element_by_tag_name("input").send_keys("孙二娘")
- # driver.find_element_by_id("input").click()
-
- # # class name定位 全局唯一
- # driver.find_element_by_class_name("s_ipt").send_keys("孙二娘")
- # driver.find_element_by_id("su").click()
-
- # # link text定位 全局唯一
- # driver.find_element_by_link_text("hao123").click()
-
- # # partial link text 全局唯一
- # driver.find_element_by_partial_link_text("123").click()
-
- # # xpath 任何元素都可以定位到
- # driver.find_element_by_xpath("//*[@id='kw']").send_keys("赵盼儿")
- # driver.find_element_by_xpath("//*[@id='su']").click()
-
- # css selector
- driver.find_element_by_css_selector("#kw").send_keys("李逍遥")
- driver.find_element_by_css_selector("#su").click()
-
- time.sleep(5)
- # 关闭浏览器
- driver.quit()
- # 操作测试对象
- from selenium import webdriver
- import time
-
- driver = webdriver.Firefox()
- driver.get("https://www.baidu.com/")
- time.sleep(3)
-
- # 搜索徐渭熊
- driver.find_element_by_css_selector("#kw").send_keys("徐渭熊")
- driver.find_element_by_css_selector("#su").submit()
- time.sleep(6)
- # 清除徐渭熊
- driver.find_element_by_id("kw").clear()
- time.sleep(5)
- driver.find_element_by_id("kw").send_keys("徐骁")
- # 提交搜索信息 和click作用一样
- driver.find_element_by_id("su").submit()
-
- time.sleep(5)
- driver.quit()
5.text 获取元素的内容
- from selenium import webdriver
- import time
-
- driver = webdriver.Firefox()
- driver.get("https://www.baidu.com/")
- time.sleep(3)
-
- # 获取文本信息
- text = driver.find_element_by_id("bottom_layer").text
- print(text)
- time.sleep(5)
- driver.quit()
结果:

当页面的元素没有加载出来的时候,无法定位到元素,因此等待的存在是非常有必要的
driver.implicitly_wait 等待页面上的元素加载出来后立刻去执行下一个相关指令
- from selenium import webdriver
- import time
-
- driver = webdriver.Firefox()
- driver.get("https://www.baidu.com/")
- driver.maximize_window()
-
- driver.find_element_by_id("kw").send_keys("林俊杰")
- driver.find_element_by_id("su").click()
- # # 固定等待
- # time.sleep(5)
- # 智能等待
- driver.implicitly_wait(5)
-
- driver.find_element_by_link_text("百度百科").click()
- time.sleep(6)
- driver.quit()
打印 title
打印URL
- from selenium import webdriver
- import time
-
- driver = webdriver.Firefox()
- driver.get("https://www.baidu.com/")
- time.sleep(3)
- driver.maximize_window()
-
- title = driver.title
- print(title)
- url = driver.current_url
- print(url)
-
- time.sleep(6)
- driver.quit()

(1)浏览器的最大化
driver.maximize_window()
(2)设置浏览器的宽和高
driver.set_window_size(400,1000)
(3)浏览器的前进和后退
后退:driver.back()
前进:driver.forward()
(4)浏览器滚动条的控制
- # 浏览器滚动条的控制
- # 底端
- js0 = "var q=document.documentElement.scrollTop=10000"
- driver.execute_script(js0)
- time.sleep(3)
- # 顶端
- js1 = "var q=document.documentElement.scrollTop=0"
- driver.execute_script(js1)
所有的键盘操作,必须立在定位到元素的基础上,因为我们是基于元素进行操作
导入工具包:from selenium.webdriver.common.keys import Keys
Keys.TAB
Keys.ENTER
组合键
导入工具包:from selenium.webdriver.common.action_chains import ActionChains
全选 send_keys(Keys.CONTROL,'a')
剪贴 send_keys(Keys.CONTROL,'x')
右击和双击(和点击的效果相同)取的前提是先定位元素
右击 ActionChains(driver).contxt_click(b).perform()
双击 ActionChains(driver).double_click(b).perform()
(1)如何打开本地的HTML页面
拼成一个URL : file: + /// + 文件绝对路径
先导包:import os os.path.abspath(文件的绝对路径)
url = "file:///" + os.path.abspath("E:\\11\\测试文件\\selenium2html/checkbox.html")
(2)先定位出同一类元素(tag name,name,class name等),然后根据需要定位的元素的特征(type)去甄别出要定位的具体元素进行操作
- from selenium import webdriver
- import time
- import os
-
- driver = webdriver.Chrome()
- url = "file:///" + os.path.abspath("E:\\11\\测试文件\\selenium2html/checkbox.html")
- driver.get(url)
- time.sleep(3)
- driver.maximize_window()
-
- # # 勾选里面所有的checkbox
- # driver.find_element_by_id("c1").click()
- # driver.find_element_by_id("c2").click()
- # driver.find_element_by_id("c3").click()
-
- # 定位一组tag name 都为input的元素
- buttons = driver.find_elements_by_tag_name("input")
- for button in buttons:
- if button.get_attribute('type') == 'checkbox':
- button.click()
-
- time.sleep(5)
- driver.quit()
iframe 框架里面嵌套框架
解决不同层框架上的页面的元素的定位
driver.switch_to.frame("f1")
(1)如果要定位一个层级框架中的元素,必须先调到这个框架层级,才可以定位
(2)如果要定位某一个层级,必须从默认页面跳转
driver.switch_to.default_content()
- from selenium import webdriver
- import time
- import os
-
- driver = webdriver.Chrome()
- url = "file:///" + os.path.abspath("C:\\课件\\我的课件\\测试\\selenium2/locateElement/selenium2html/frame.html")
- driver.get(url)
- time.sleep(3)
- driver.maximize_window()
- # 从默认页面到 f1 框架页面
- driver.switch_to.frame("f1")
- driver.find_element_by_link_text("click").click()
-
- # 回到默认页面
- driver.switch_to.default_content()
-
- driver.switch_to_frame()
-
- time.sleep(6)
- driver.quit()
由link1找到Another action 让鼠标定位到Another action
- from selenium import webdriver
- import time
- import os
- from selenium.webdriver.common.action_chains import ActionChains
-
- driver = webdriver.Chrome()
- url = "file:///"+os.path.abspath("E:\\11\\测试文件\\selenium2html/level_locate.html")
- driver.get(url)
-
- driver.maximize_window()
- # 定位link1,点击
- driver.find_element_by_link_text("Link1").click()
- driver.implicitly_wait(10)
- # 定位 Another Action
- action = driver.find_element_by_link_text("Another action")
- # 高亮显示Another action, 把鼠标移动到 Another action上面
- ActionChains(driver).move_to_element(action).perform()
-
- time.sleep(6)
- driver.quit()
(1)直接用xpath定位
(2)先定位出一组元素(tag name等),然后根据元素的属性进行过滤筛选,再进行具体操作
(3)先定位出一组元素(tag name等),通过数组下标的方式定位

- from selenium import webdriver
- import time
- import os
- from selenium.webdriver.common.action_chains import ActionChains
-
- driver = webdriver.Chrome()
- url = "file:///"+os.path.abspath("E:\\11\\测试文件\\selenium2html/drop_down.html")
- driver.get(url)
- driver.maximize_window()
- time.sleep(3)
- # # xpath 定位
- # driver.find_element_by_xpath("//*[@id='ShippingMethod']/option[3]").click()
-
- options = driver.find_elements_by_tag_name("option")
- # 方法1
- # for option in options:
- # if option.get_attribute('value') == '10.69':
- # option.click()
- # 方法2
- options[2].click()
-
- time.sleep(6)
- driver.quit()
- # 定位弹出框/获得弹出框的操作句柄
- alert = driver.switch_to.alert
-
- # 关闭 alert
- alert.accept()
如果弹框需要输入信息:
- # 先获取弹出框的操作句柄
- alert = driver.switch_to.alert
- # 再用send_keys去输入信息
- alert.send_keys("你好世界")
适用于页面复杂,元素非常多,没有id,并且name或者tag name 重复
(1)首先要定位元素所在的div模块
(2)在定位到的div模块的基础上去精确寻找需要定位的元素
- # 点击div 框框里面的click me,让弹出框内容发生变化
- div1 = driver.find_element_by_class_name("modal-body")
- div1.find_element_by_link_text("click me").click()
- time.sleep(4)

定位上传按钮
send_keys(需要上传文件的绝对路径+文件名字)
driver.find_element_by_name("file").send_keys("C:\\Users\\lingqi\\Pictures/test.jpg")
比如网易邮箱登录时,用 id 进行定位,你每次打开页面或者刷新的时候 id 会变
为安全性考虑 因此无法定位
会有人恶意用自动化一直输入账号密码来盗取你的账号