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)

 

posted @ 2024-07-03 09:55  锦绣良缘  阅读(39)  评论(0)    收藏  举报