Web自动化---Selenium的基本使用

it2026-01-10  9

目录

一: 环境搭建:1: 安装Selenium:2: 安装谷歌驱动WebDriver: 二:简单案例:1:打开百度网址3秒后关闭。2:环境变量问题: 三:元素定位:1:案例演示定位2:演示如果出现异常信息3:Xpath定位:1: 相对路径和绝对路径:2: 案例: 4:CSS定位:4.1: CSS定位比Xpath定位的速度更快。4.2: 代码演示: 5: 查询多个元素 四: 元素等待:1: 为什么要设置元素等待?2:显示等待与隐式等待2.1:概念:2.2 : 显示等待的设置:2.3: 隐式等待: 五: 常用的方法和属性:<一>: 浏览器常用的属性和方法:1:属性2: 方法3: 窗口执行4:执行JS代码5:cookie <二>: 元素常用的属性和方法:1: 模拟鼠标点击2: 输入框填充数据和清空数据3:获取标签的属性 <三>: 行为链(ActionChains):1: 什么是行为链?2:ActionChains使用的步骤:3: 常用的行为链方法:4: 案例: 六:窗口,frame, 警告框:1: 窗口2:frame3:警告框 七:下拉选择框,无界面模式:1: 下拉选择框Select类:常用属性和方法:案例一:单选框:循环选中案例二:多选框:循环选中再取消 2:无界面模式

一: 环境搭建:

1: 安装Selenium:

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

2: 安装谷歌驱动WebDriver:

打开谷歌浏览器—>检查—>关于:查看自己的谷歌版本。我的是85版本。 下载匹配的版本:

https://npm.taobao.org/mirrors/chromedriver

解压后,将chromedriver.exe放在我们的项目中。

二:简单案例:

1:打开百度网址3秒后关闭。

import time # 导包 from selenium.webdriver import Chrome # 实例化一个driver对象 driver = Chrome(executable_path='./chromedriver') # 打开网络地址 driver.get("http://www.baidu.com") # 睡眠3秒 time.sleep(3) # 关闭driver driver.quit()

如果想打开windows本地的一个网页:

driver.get(r"file:C:\Users\11737\Desktop\Selenium_project\demo.html")

2:环境变量问题:

解决方案一: 放在本地的python可执行文件同级目录。

1: 右击电脑属性 2:点击高级系统设置 3:点击环境变量 4:选中用户中的path 5: 找到python3.6所在的位置,将chromedriver放入整个目录中。

解决方案二: 放在任意目录,将所在目录加入到环境变量中,不推荐。

三:元素定位:

通过 id 属性定位 : find_element_by_id通过 name 属性定位 : find_element_by_name通过 class 属性定位 : find_element_by_class_name通过标签名定位 : find_element_by_tag_name通过内容定位 a 标签(绝对匹配) : find_element_by_link_text通过内容定位 a 标签(模糊匹配) : find_element_by_partial_link_text

1:案例演示定位

traceback: 可以打印异常的详细信息。 import time import traceback from selenium.webdriver import Chrome # 实例化一个driver对象 driver = Chrome(executable_path='./chromedriver') # 打开网络地址 driver.get(r"file:C:\Users\11737\Desktop\Selenium_project\demo.html") try: print(driver.find_element_by_id('username')) # 通过 id 属性定位 driver.find_element_by_name('password2') # 通过 name 属性定位 driver.find_element_by_class_name('input-password') # 通过 class 属性定位 driver.find_element_by_tag_name('ul') # 通过标签名定位 driver.find_element_by_link_text('标签') # 通过内容定位 a 标签(绝对匹配) driver.find_element_by_partial_link_text('Optimization') # 通过内容定位 a 标签(模糊匹配) time.sleep(3) except Exception: print(traceback.format_exc()) finally: driver.quit()

2:演示如果出现异常信息

将username改成username2222,则会找不到报错。 结果:

traceback: 可以打印异常的详细信息。

3:Xpath定位:

1: 相对路径和绝对路径:

绝对路径: 以/开头: 例如: /html/body/form/input相对路径: 以//开头:例如: //form/input定位方法: find_element_by_xpath(“路径”)单个属性: find_element_by_xpath("//input[@type=‘text’]")多个属性:find_element_by_xpath("//input[@type=‘text’ and @name=‘username’]")选择上级元素: find_element_by_xpath("//input/…")选择其中一个元素(默认第一个): find_element_by_xpath("//ul/li")选择其中一个元素(指定第几个):find_element_by_xpath("//ul/li[1]")选择最后一个元素: find_element_by_xpath("//ul/li[last()]")选择倒数第二个元素: find_element_by_xpath("//ul/li[last()-1]") 注意: 括号的下标是从1开始的,不是从0开始。

2: 案例:

from selenium.webdriver import Chrome import traceback # 1: 实例化driver driver = Chrome() # 打开本地文件 driver.get(r'file://C:\Users\11737\Desktop\Selenium_project\test.html') # 打开本地 html 文件 try: # 1: 绝对路径获取元素对象 print(driver.find_element_by_xpath('/html/body/form/input')) # 2:相对路径获取元素对象 print(driver.find_element_by_xpath('//div/ul/li')) # 3: 单属性定位 print(driver.find_element_by_xpath('//form/input[@name="password"]')) # 4: 多属性定位 print(driver.find_element_by_xpath('//form/input[@name="password2" and @type="text"]')) # 5: 定位上级元素 print(driver.find_element_by_xpath('//li/..')) # 6: 定位第一个li元素 print(driver.find_element_by_xpath('//ul/li[1]')) # 7: 定位最后一个li元素 print(driver.find_element_by_xpath('//ul/li[last()]')) # 8: 定位倒数第二个元素 print(driver.find_element_by_xpath('//ul/li[last()-1]')) except Exception: print(traceback.format_exc()) finally: # 退出浏览器 driver.quit()

4:CSS定位:

4.1: CSS定位比Xpath定位的速度更快。

4.2: 代码演示:

from selenium.webdriver import Chrome import traceback # 1: 实例化driver driver = Chrome() # 打开本地文件 driver.get(r'file://C:\Users\11737\Desktop\Selenium_project\test.html') # 打开本地 html 文件 try: # 1: 使用id选择器 print(driver.find_element_by_css_selector('#username')) # 2: 使用类选择器 print(driver.find_element_by_css_selector('.input-text')) # 3: 使用标签选择器 print(driver.find_element_by_css_selector('form')) # 4: 使用标签属性选择器 print(driver.find_element_by_css_selector('input[type="password"]')) # 5: 使用子代选择器 print(driver.find_element_by_css_selector('div>ul')) except Exception: print(traceback.format_exc()) finally: # 退出浏览器 driver.quit()

5: 查询多个元素

上面三种方式查询多个元素只需要加s。调用这类方法会返回一个列表,如果没有查询任何一个返回空列表。 # 将返回列表 print(driver.find_elements_by_id('username')) # 返回空列表 print(driver.find_elements_by_id('username222')) print(driver.find_elements_by_name('username')) print(driver.find_elements_by_class_name('input-text')) print(driver.find_elements_by_tag_name('input')) print(driver.find_elements_by_link_text('标签')) print(driver.find_elements_by_partial_link_text('签')) print(driver.find_elements_by_xpath('//form/input')) # 1: 使用id选择器 print(driver.find_elements_by_css_selector('#username')) # 2: 使用类选择器 print(driver.find_elements_by_css_selector('.input-text')) # 3: 使用标签选择器 print(driver.find_elements_by_css_selector('form')) # 4: 使用标签属性选择器 print(driver.find_elements_by_css_selector('input[type="password"]')) # 5: 使用子代选择器 print(driver.find_elements_by_css_selector('div>ul'))

四: 元素等待:

1: 为什么要设置元素等待?

答: 如果我们要定位某个元素,但是这个元素是浏览器后期经过Ajax请求获取的,如果我们不设置元素等待,那么可能这个元素还不存在时,程序就开始寻找这个元素了,那么就会错过元素,或者找不到元素。

2:显示等待与隐式等待

2.1:概念:

显示等待就是等待指定元素加载完成,就不再等待,所用的时间比较短。如果所有元素都加载完了还没有找到元素,就报错。隐式等待指的是,等待所有页面加载完成之后,再寻找元素,找不到就报错,相比显示等待,所用的时间较长。

2.2 : 显示等待的设置:

from selenium.webdriver import Chrome import traceback # 1: 实例化driver from selenium.webdriver.support.wait import WebDriverWait driver = Chrome() # 打开本地文件 driver.get(r'file://C:\Users\11737\Desktop\Selenium_project\test.html') # 打开本地 html 文件 try: #1 : 创建等待对象(驱动对象, 等待时间, 找不到多久执行一次函数) # 此时找不到就会执行5次中间的这个函数。 wait_driver = WebDriverWait(driver, 10, 2) # 2: 定义一个返回标签元素对象的函数 def temp_func(temp_driver): print("我被调用了") return temp_driver.find_element_by_tag_name('html222') # 3:使用等待对象的until方法。 wait_driver.until(temp_func) except Exception: print(traceback.format_exc()) finally: # 退出浏览器 driver.quit()

修改成lambda 的格式:

from selenium.webdriver import Chrome import traceback # 1: 实例化driver from selenium.webdriver.support.wait import WebDriverWait driver = Chrome() # 打开本地文件 driver.get(r'file://C:\Users\11737\Desktop\Selenium_project\test.html') # 打开本地 html 文件 try: #1 : 创建等待对象(驱动对象, 等待时间, 找不到多久执行一次函数) # 此时找不到就会执行5次中间的这个函数。 wait_driver = WebDriverWait(driver, 10, 2) # 2: 定义一个返回标签元素对象的函数 # 3:使用等待对象的until方法。 wait_driver.until(lambda temp_driver:temp_driver.find_element_by_tag_name('html')) except Exception: print(traceback.format_exc()) finally: # 退出浏览器 driver.quit()

再次我想等不能进行一下封装,构造一个函数,能够根据传入的指定的查找方式,获取指定的元素对象?

from selenium.webdriver import Chrome import traceback # 1: 实例化driver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait driver = Chrome() # 打开本地文件 driver.get(r'file://C:\Users\11737\Desktop\Selenium_project\test.html') # 打开本地 html 文件 def find_wait(by=By.ID,value=None, _t=10 ): wait_driver = WebDriverWait(driver, _t) el = wait_driver.until(lambda temp_driver: temp_driver.find_element(by, value)) return el try: el = find_wait(By.ID, "username") except Exception: print(traceback.format_exc()) finally: # 退出浏览器 driver.quit()

2.3: 隐式等待:

from selenium.webdriver import Chrome import traceback # 1: 实例化driver from selenium.webdriver.support.wait import WebDriverWait driver = Chrome() # 打开本地文件 driver.get(r'file://C:\Users\11737\Desktop\Selenium_project\test.html') # 打开本地 html 文件 driver.implicitly_wait(10) # 设置等待时间 try: driver.find_element_by_id('username') except Exception: print(traceback.format_exc()) finally: # 退出浏览器 driver.quit()

五: 常用的方法和属性:

<一>: 浏览器常用的属性和方法:

1:属性

import traceback # 实例化driver driver = Chrome() # 打开百度 driver.get("http://www.baidu.com") # 1: 获取浏览器的名字 print("浏览器的名字是:", driver.name) # 2: 获取当前网页的标题 print("当前网页的标题是: ", driver.title) # 3:当前网页的网址 print("当前网页的网址是: ", driver.current_url) # 4: 当前网页的源码 print("当前网页的源码是: ", driver.page_source) driver.quit()

2: 方法

driver.close() # 关闭当前窗口 driver.quit() # 关闭浏览器 # 历史 driver.back() # 历史后退 driver.forward() # 历史前进 # 刷新页面 driver.refresh() # 刷新页面 # 窗口大小位置 driver.maximize_window() # 浏览器最大化 driver.fullscreen_window() # 浏览器全屏 driver.minimize_window() # 浏览器最小化

3: 窗口执行

作用: 代码出错时,对出错时的浏览器内容进行截图。 案例: 打开百度网址,对网址截图:

from selenium.webdriver import Chrome import time # 实例化driver driver = Chrome() driver.get("http://www.baidu.com") # 窗口最大化 driver.maximize_window() # 隐式等待 driver.implicitly_wait(2) # 截图保存 driver.get_screenshot_as_file('baidu.png') time.sleep(2) driver.quit()

4:执行JS代码

案例: 访问百度后,弹出警告窗口“哈哈哈,我是警告”

from selenium.webdriver import Chrome import time # 实例化driver driver = Chrome() driver.get("http://www.baidu.com") # 窗口最大化 driver.maximize_window() # 隐式等待 driver.implicitly_wait(2) # 截图保存 driver.execute_script("alert('哈哈哈,我是警告')") time.sleep(2) driver.quit()

5:cookie

案例: 进入百度网页,获取所有cookie,获取指定cookie,删除指定cookie,删除所有cookie,添加一个cookie,再次查看所有cookie。

from selenium.webdriver import Chrome import time # 实例化driver driver = Chrome() driver.get("http://www.baidu.com") # 1:获取所有cookie print(driver.get_cookies()) # 2:获取名为BD_HOME的cookie print(driver.get_cookie('BD_HOME')) # 3: 增加cookie名为name,值为善文 driver.add_cookie({'name': "name", 'value': '善文'}) print(driver.get_cookie('name')) # 4: 删除指定cookie driver.delete_cookie('name') print(driver.get_cookie('name')) # 5: 删除所有cookie driver.delete_all_cookies() print(driver.get_cookies()) time.sleep(2) driver.quit()

<二>: 元素常用的属性和方法:

1: 模拟鼠标点击

2: 输入框填充数据和清空数据

3:获取标签的属性

案例: 访问百度浏览器,输入框中输入“任善文”,然后清空输入框,再写入“牛牛”,然后打印获取输入框的属性,最后点击搜索。

from selenium.webdriver import Chrome import time # 实例化driver driver = Chrome() driver.get("http://www.baidu.com") # 1:获取文本框 el = driver.find_element_by_class_name('s_ipt') # 2: 输入“任善文”,清空,再输入“牛牛” el.send_keys("任善文") time.sleep(2) el.clear() time.sleep(2) el.send_keys("牛牛") # 3:鼠标点击 el.click() time.sleep(2) time.sleep(2) driver.quit()

<三>: 行为链(ActionChains):

1: 什么是行为链?

答:组合多个行为来完成一个目标操作,比如:按下 shift --> 按下 a -->松开 a --> 松开 shift。

2:ActionChains使用的步骤:

实例化ActionChains添加行为(行为链)ActionChains的perform(),执行。

3: 常用的行为链方法:

reset_actions(self) : 清空行为链click(self, on_element=None): 鼠标点击click_and_hold(self, on_element=None) : 鼠标按下release(self, on_element=None) : 松开鼠标context_click(self, on_element=None) : 鼠标右击double_click(self, on_element=None) : 鼠标双击drag_and_drop(self, source, target) : 拖动元素,source 被拖动元素,target 表示被拖动到那个元素中drag_and_drop_by_offset(self, source, xoffset, yoffset) : 拖动元素,给定x,y 轴偏移key_down(self, value, element=None) : 按键按下key_up(self, value, element=None) : 按键松开move_by_offset(self, xoffset, yoffset) : 鼠标箭头移动,给定 x,y 轴偏移move_to_element(self, to_element) : 鼠标移动到某个元素中心move_to_element_with_offset(self, to_element, xoffset, yoffset) : 鼠标移动到元素内的 x,y 轴位置send_keys(self, *keys_to_send): 发送多个按键,也可以是一个字符串send_keys_to_element(self, element, *keys_to_send) :

4: 案例:

要求: 打开百度,在文本框中输入Aa,Aa的输入需要行为链。

from selenium.webdriver import Chrome, ActionChains import time # 实例化driver from selenium.webdriver.common.keys import Keys driver = Chrome() driver.get("http://www.baidu.com") # 1:获取文本框 el = driver.find_element_by_class_name('s_ipt') # 2:实例化行为链 actions = ActionChains(driver) # 3: 添加行为:移动到文本框,然后点击,按下SHIFT再按a,抬起SHUIFT,再按a。 actions.move_to_element(el).click().key_down(Keys.SHIFT).key_down('a').key_up(Keys.SHIFT).key_down('a') # 4:执行行为链 actions.perform() time.sleep(2) el2 = driver.find_element_by_id('su') el2.click() time.sleep(2) driver.quit()

六:窗口,frame, 警告框:

1: 窗口

案例: 多窗口的切换

from selenium.webdriver import Chrome import time driver = Chrome() driver.get('http://www.baidu.com') # 打开新的窗口 driver.find_element_by_link_text('新闻').click() # 这里虽然点击了新闻页面,但是页面还是搜索页面。 # 查看所有窗口句柄 print(driver.window_handles) # 查看当前的窗口句柄 print(driver.current_window_handle) # 切换窗口 driver.switch_to.window(driver.window_handles[1]) # 切换到新闻页面 print(driver.current_window_handle) time.sleep(5) # 切回窗口 driver.switch_to.window(driver.window_handles[0])# 切换回搜索页面 print(driver.current_window_handle) driver.quit()

2:frame

frame:HTML页面中的一种框架,主要作用是在当前页面嵌套另一页面页面; (HTML语言中,frame/iframe标签为表单框架)webdriver只能访问一个页面,默认是外层页面,如果要访问嵌套的页面,必须切换当前到嵌套页面中。

案例:QQ邮箱的登录界面是一个页面里面又内嵌了一个frame,frame中的元素才是登录呢,现在要求

from selenium.webdriver import Chrome import time driver = Chrome() driver.get('https://mail.qq.com/') # 1: 找到iframe元素 frame=driver.find_element_by_id('login_frame') # 2: 切换到iframe元素内部 driver.switch_to.frame(frame) el = driver.find_element_by_id("switcher_plogin") el.click() # 4:延迟3秒 time.sleep(3) driver.quit()

3:警告框

案例: 打开百度,弹出警告框,点击接收或者取消。

from selenium.webdriver import Chrome import time driver = Chrome() driver.get('http://www.baidu.com') # 打开一个警告框 driver.execute_script("alert('hello')") time.sleep(3) # 切换到警告框 alert = driver.switch_to.alert # 关闭警告框 # alert.dismiss() # 接受警告框 alert.accept()

七:下拉选择框,无界面模式:

1: 下拉选择框

Select类:

Select 类是 WebDriver 为解决 select 标签定位诞生的,此类定位的是 select 标签

常用属性和方法:

select.options # select 中所有 options

select.all_selected_options # 所有被选中的 option

select.first_selected_option # 第一个被选中的 option

select.select_by_value(value) # 通过 option 的值选中

select.select_by_index(index) # 通过 option 的下标选中

select.select_by_visible_text(text) # 通过 option 的可见文本选中

select.deselect_all() # 全部不选中

select.deselect_by_value(value) # 通过 option 的值取消选中

select.deselect_by_index(index) # 通过 option 的下标取消选中

select.deselect_by_visible_text(text) # 通过 option 的文本取消选中

案例一:单选框:循环选中

import time from selenium.webdriver.support.select import Select from selenium.webdriver import Chrome driver = Chrome() # 控制浏览器访问url地址 driver.get(r'file://C:\Users\11737\Desktop\Selenium_project\test.html') # 找到单选框 el = driver.find_element_by_id('select-single') # 用Select()类创建一个select对象 select_single = Select(el) # 对象的options是所有被选中的标签对象 options=select_single.options # 单选一个一个的切换,中间睡一秒 for i in range(len(options)): # 通过下标选中 select_single.select_by_index(i) time.sleep(1)

案例二:多选框:循环选中再取消

import time from selenium.webdriver.support.select import Select from selenium.webdriver import Chrome driver = Chrome() # 控制浏览器访问url地址 driver.get(r'file://C:\Users\11737\Desktop\Selenium_project\test.html') # 多选 select el = driver.find_element_by_id('select-multiple') select = Select(el) options=select.options print(options) # 全部不选中 select.deselect_all() for i in range(len(options)): # 通过下标选中 select.select_by_index(i) time.sleep(1) select.deselect_all()

2:无界面模式

开启无界面模式的方法 1: 实例化配置对象 options = webdriver.ChromeOptions() 2: 配置对象添加开启无界面模式的命令 options.add_argument("–headless") 3: 配置对象添加禁用gpu的命令 options.add_argument("–disable-gpu") 4: 实例化带有配置对象的driver对象 driver = webdriver.Chrome(’./chromedriver’, options=options)

from selenium import webdriver options = webdriver.ChromeOptions() # 创建一个配置对象 options.add_argument("--headless") # 开启无界面模式 options.add_argument("--disable-gpu") # 禁用gpu driver = webdriver.Chrome(options=options) # 实例化带有配置的driver对象 driver.get('https://www.baidu.com') print(driver.title) driver.quit()
最新回复(0)