python自动化selenium的使用
Selenium 是一个自动化测试工具,用于模拟用户在 Web 应用程序中的交互行为。
安装selenium
1 pip install selenium
在项目下放入浏览器驱动(这里使用的是Chrome的驱动)
Chrome的驱动的下载网址,请根据自己的浏览器的版本自行下载
查看浏览器的版本

selenium的使用步骤
1 #第一步 2 #导入模块 3 from selenium import webdriver 4 from selenium.webdriver.common.by import By 5 6 #禁止浏览器自动关闭 7 option=webdriver.ChromeOptions() 8 option.add_experimental_option("detach",True) 9 10 #第二步 11 # 创建 Chrome 浏览器实例 12 driver=webdriver.Chrome(options=option) 13 14 #第三步 15 # 在浏览器中打开百度网站 16 driver.get("https://www.baidu.com/") 17 18 #窗口最大化 19 driver.maximize_window() 20 21 #第四步 22 #定位元素 23 driver.find_element(By.ID,"kw").send_keys("selenium")
selenium的定位
1 #返回当前满足条件的WebElement 对象 2 driver.find_element(by, value) 3 4 #返回当前满足条件的WebElement对象列表 5 driver.find_elements(by, value)
定位的类型
| 定位类型 | 说明 |
|---|---|
| By.ID | 根据id定位 |
| By.XPATH | 根据xpath定位 |
| By.CLASS_NAME | 根据class的名称 |
| By.LINK_TEXT | 元素链接文本定位 |
| By.TAG_NAME | 元素标签名定位 |
| By.CSS_SELECTOR | 根据元素 CSS 选择器定位 |
| By.PARTIAL_LINK_TEXT | 根据元素部分链接文本定位 |
| By.NAME | 根据元素名称定位 |
WebElemen类中部分方法说明
| 方法或属性 | 说明 |
|---|---|
| tag_name | 获取元素的标签名 |
| text | 获取元素的文本信息 |
| click() | 点击 |
| send_keys(values) | 输入文字 |
| submit() | 提交表单from |
| clear() | 清除文本 |
| get_property(name) | 获取 JavaScript 属性值,name表示属性名 |
| get_dom_attribute(name) | 获取 DOM 属性的值,name表示属性名 |
| is_selected() | 判断元素是否被选中,用于复选框和单选框 |
获取文档内容
1 driver.page_source
鼠标操作
所有鼠标操作方法都需要使用 ActionChains 类来创建操作链,并调用 perform() 方法执行操作
1 #导入鼠标操作的相关的类 2 from selenium import webdriver 3 from selenium.webdriver.common.by import By 4 from selenium.webdriver.common.action_chains import ActionChains 5 6 option=webdriver.ChromeOptions() 7 option.add_experimental_option("detach",True) 8 9 10 driver=webdriver.Chrome(options=option) 11 driver.maximize_window() 12 driver.get("https://www.baidu.com/") 13 14 #鼠标悬浮操作 15 ActionChains(driver).move_to_element(driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/a")).perform()
ActionChains类中常用的方法说明
| 方法 | 说明 |
|---|---|
| click(element=None) | 单击指定的元素 |
| double_click(element=None) | 双击指定的元素 |
| context_click(element=None) | 右击指定的元素 |
| drag_and_drop(source, target) | 拖拽源元素到目标元素 |
| move_to_element(to_element) | 将鼠标移动到指定元素的中心位置 |
| move_by_offset(xoffset, yoffset) | 模拟鼠标移动,其中 xoffset 和 yoffset 分别表示鼠标在水平和垂直方向上的移动距离,单位为像素 |
| perform() | 执行ActionChains类中存储的所有行为 |
键盘操作
1 # coding=utf-8 2 from selenium import webdriver 3 from selenium.webdriver.common.by import By 4 from selenium.webdriver.common.keys import Keys 5 6 driver=webdriver.Chrome() 7 driver.get("https://www.baidu.com") 8 driver.find_element(By.ID,"kw").send_keys("selenium") 9 10 #输入组合键 Ctrl+a,全选输入框内容 11 driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,"a") 12 13 #输入组合键 Ctrl+x,剪切输入框内容 14 driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,"x")
等待
1 import time 2 from selenium import webdriver 3 4 driver = webdriver.Chrome() 5 driver.get("https://www.baidu.com") 6 #强制等待 7 time.sleep(5) # 暂停 5 秒 8 driver.quit() 9 10 #隐士等待 11 # driver.implicitly_wait(20) 12 动态等待 13 14 from selenium.webdriver.common.by import By 15 from selenium.webdriver.support.ui import WebDriverWait 16 from selenium.webdriver.support import expected_conditions as EC 17 18 driver = webdriver.Chrome() 19 20 #设置隐式等待10秒 21 #driver.implicitly_wait(10) 22 driver.get("https://www.baidu.com") 23 24 25 26 27 # 等待 5 秒,直到页面中出现 id 为 kw 的元素 28 element = WebDriverWait(driver, 5).until( 29 EC.presence_of_element_located((By.ID, "kw")) 30 )
多表单切换
1 #参数可以是iframe的id或name属性,也可以使WebElement 2 switch_to.frame() 3 4 #回退 5 switch_to.parent_frame() 6 7 #返回最外层的页面 8 switch_to.default_content() 9 10 11 代码示例 12 13 # coding=utf-8 14 from selenium import webdriver 15 from selenium.webdriver.common.by import By 16 from selenium.webdriver.common.action_chains import ActionChains 17 18 option=webdriver.ChromeOptions() 19 option.add_experimental_option("detach",True) 20 driver=webdriver.Chrome(options=option) 21 driver.maximize_window() 22 driver.implicitly_wait(5) 23 driver.get("http://i.chaoxing.com/") 24 25 # 登录学习通 26 driver.find_element(By.ID,"phone").send_keys("XXXXX") 27 driver.find_element(By.ID,"pwd").send_keys("XXXXX") 28 driver.find_element(By.ID,"loginBtn").click() 29 30 # ---------------------------------------------------------------------- 31 # 多表单的切换 32 33 # 切换到 ID为 frame_content 的iframe表单中 34 driver.switch_to.frame(driver.find_element(By.ID,"frame_content")) 35 36 # 获取添加课程的文本信息 37 text=driver.find_element(By.ID,"addCourse").text 38 print(text) 39 40 # 回退到上一层的frame 41 driver.switch_to.parent_frame() 42 text2=driver.find_element(By.ID,"siteName").text 43 print(text2) 44 45 46 driver.switch_to.frame(driver.find_element(By.ID,"frame_content")) 47 48 # 回退到最外层的frame 49 driver.switch_to.default_content() 50 51 text2=driver.find_element(By.ID,"siteName").text 52 print(text2)
多窗口切换
1 获得当前窗口句柄 2 3 #获得当前窗口句柄 4 current_window_handle 5 6 #返回所有窗口的句柄 7 driver.window_handles 8 9 #切换到相应的窗口 10 switch_to.window(句柄) 11 代码示例 12 13 # coding=utf-8 14 from selenium import webdriver 15 from selenium.webdriver.common.by import By 16 from selenium.webdriver.common.action_chains import ActionChains 17 18 option=webdriver.ChromeOptions() 19 option.add_experimental_option("detach",True) 20 21 22 driver=webdriver.Chrome(options=option) 23 driver.maximize_window() 24 driver.implicitly_wait(5) 25 driver.get("https://www.baidu.com/") 26 27 # 鼠标悬浮操作 28 ActionChains(driver).move_to_element(driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/a")).perform() 29 driver.find_element(By.XPATH,"/html/body/div[1]/div[1]/div[3]/div/div/div[1]/a[2]/img").click() 30 31 #获取当前的句柄 32 windowID=driver.current_window_handle 33 print(windowID) 34 35 #获取所有句柄 36 windowsID=driver.window_handles 37 print(windowsID) 38 39 #切换窗口 40 driver.switch_to.window(windowsID[0]) 41 42 driver.find_element(By.ID,"kw").send_keys("ok")
警告框的处理
1 获取警告框 2 3 switch_to.alert() 4 5 6 # coding=utf-8 7 import time 8 9 from selenium import webdriver 10 from selenium.webdriver.common.by import By 11 12 13 option=webdriver.ChromeOptions() 14 option.add_experimental_option("detach",True) 15 driver=webdriver.Chrome(options=option) 16 driver.maximize_window() 17 driver.implicitly_wait(5) 18 driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_js_prompt") 19 20 driver.switch_to.frame(driver.find_element(By.ID,"iframeResult")) 21 driver.find_element(By.TAG_NAME,"button").click() 22 23 24 # 获取警告框 25 alert=driver.switch_to.alert 26 27 # 获取警告框的提示信息 28 print(alert.text) 29 30 #在警告框输入内容 31 alert.send_keys("ssssssss") 32 33 # 接收弹窗 34 35 time.sleep(10) 36 alert.accept()
下拉框处理
Select类用来处理下拉框
| 方法名称 | 说明 |
|---|---|
| select_by_value() | 通过value值定位下拉选项 |
| select_by_visible_text() | 通过text值定位下拉选项 |
| select_by_index() | 根据下拉选项的索引进行选择。第一个选项为0,第二个位选项为1 |
1 # encoding:utf-8 2 import time 3 from selenium import webdriver 4 from selenium.webdriver.common.by import By 5 from selenium.webdriver.support.select import Select 6 7 option=webdriver.ChromeOptions() 8 option.add_experimental_option("detach",True) 9 10 driver=webdriver.Chrome(options=option) 11 driver.implicitly_wait(60) 12 driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_html_select") 13 driver.switch_to.frame(driver.find_element(By.ID,"iframeResult")) 14 element = driver.find_element(By.TAG_NAME, "select") 15 16 # select_by_value的使用 17 18 Select(element).select_by_value("saab") 19 20 # select_by_index的使用 21 time.sleep(5) 22 Select(element).select_by_index(2) 23 24 25 26 # select_by_visible_text 27 time.sleep(5) 28 Select(element).select_by_visible_text("Audi")
调用JavaScript
1 execute_script() 2 3 4 5 6 7 登录i博思 8 9 from selenium import webdriver 10 from selenium.webdriver.common.by import By 11 from PIL import Image 12 import base64 13 import requests 14 15 16 17 def tubianzhibie(imgpath): 18 url = "https://aip.baidubce.com/oauth/2.0/token" 19 params = {"grant_type": "client_credentials", "client_id": "", "client_secret": ""} 20 21 #获取token 22 access_token=str(requests.post(url, params=params).json().get("access_token")) 23 url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" +access_token 24 with open(imgpath, 'rb') as f: 25 img = base64.b64encode(f.read()) 26 params = {"image": img} 27 headers = {'content-type': 'application/x-www-form-urlencoded'} 28 response = requests.post(url, data=params, headers=headers) 29 if response: 30 return response.json()["words_result"][0]["words"] 31 32 option=webdriver.ChromeOptions() 33 option.add_experimental_option("detach",True) 34 35 dirver=webdriver.Chrome(options=option) 36 dirver.implicitly_wait(60) 37 dirver.get("http://nnxy.iflysse.com/Login_nnxy.aspx") 38 dirver.maximize_window() 39 40 41 dirver.find_element(By.XPATH,"/html/body/div[1]/div[2]/div[2]/div[2]/div[1]/div[2]/img").click() 42 43 # i博思账号 44 dirver.find_element(By.ID,"lo-account").send_keys("XXXX") 45 46 # i密码 47 dirver.find_element(By.ID,"lo-psw").send_keys("XXXX") 48 49 dirver.save_screenshot("1.png") 50 code_el=dirver.find_element(By.ID,"imgCode") 51 52 53 54 left=code_el.location["x"] - 5 55 top=code_el.location["y"] 56 right=code_el.size["width"] + left + 5 57 heigh=code_el.size["height"] + top + 3 58 59 im=Image.open("1.png") 60 img=im.crop((left,top,right,heigh)) 61 img.save("2.png") 62 63 code=tubianzhibie("2.png") 64 65 if "=" in code: 66 code=int(eval(code.split("=")[0])) 67 68 dirver.find_element(By.ID,'lo-code').send_keys(code) 69 70 dirver.find_element(By.ID,'login').click() 71
使用selenium连接已经打开的浏览器
1 先使用如下命令打开浏览器 2 3 chrome.exe --remote-debugging-port=9999 --user-data-dir="C:\test" 4 参数说明 5 6 --remote-debugging-port:表示调式使用的端口 7 8 --user-data-dir:表示浏览器环境存放的位置 9 10 代码 11 12 from selenium import webdriver 13 from selenium.webdriver.chrome.options import Options 14 15 options = Options() 16 options.add_experimental_option("debuggerAddress", "127.0.0.1:9999") 17 driver = webdriver.Chrome(options=options)