当前位置:   article > 正文

自动化测试-selenium知识点大全【python】_selenium自动化

selenium自动化

在使用selenium之前必须搭建好环境,搭建环境可查看文章:自动化测试-selenium-CSDN博客

目录

一、浏览器基本操作

1、导入Selenium模块

2、打开网站

3、设置休眠

4、页面刷新

5、前进和后退

6、设置窗口大小

7、截屏

8、退出

9、获取页面基础属性

二、定位页面元素

1、 打开指定页面

2、 id 定位

3、name 定位

4、class 定位

5、 tag 定位

6、link 定位

7、partial_link 定位

8、Xpath定位

9、css 定位

三、鼠标控制

1、单击左键

2、单击右键

3、双击

4、拖动

5、鼠标悬停

四、键盘控制

1、前言

2、keys类常用方法

3、操作案例

五、切换句柄

1、前言

2、方法

3、使用流程

4、实现案例

五、切换操作

1、窗口切换

2、表单切换

六、弹窗处理

1、JavaScript三种弹出对话框的简单介绍

(1)alert() - 警告框

(2)confirm() - 确认框

(3)prompt() - 提示框

2、selenium 处理弹出对话框的常用方法

(1)selenium 处理 alert() 弹窗

(2)selenium 处理 confirm() 弹窗

(3)selenium 处理 prompt() 弹窗

七、上传&下载文件

1、上传文件

2、下载文件

八、cookies操作/调用JavaScript

1、cookies操作

2、调用JavaScript滑动滚动

(1)通过 x ,y 坐标滑动

(2)滚动到窗口底部,然后定位要找的元素

(3)将元素滚动到可视范围之内

九、其他操作

1、关闭所有页面

2、关闭当前页面

3、对当前页面进行截图

4、常用方法总结


一、浏览器基本操作

1、导入Selenium模块

  1. # 导入selenium模块
  2. from selenium import webdriver

2、打开网站

这里以百度为例

  1. from selenium import webdriver
  2. # 初始化浏览器为chrome浏览器
  3. browser = webdriver.Chrome()
  4. # 访问百度首页
  5. browser.get('https://www.baidu.com/')

3、设置休眠

time.sleep(5)

  1. from selenium import webdriver
  2. import time
  3. # 初始化浏览器为chrome浏览器
  4. browser = webdriver.Chrome()
  5. # 访问百度首页
  6. browser.get('https://www.baidu.com/')
  7. # 强制等待5秒
  8. time.sleep(5)

4、页面刷新

browser.refresh()

  1. from selenium import webdriver
  2. import time
  3. # 初始化浏览器为chrome浏览器
  4. browser = webdriver.Chrome()
  5. # 访问百度首页
  6. browser.get('https://www.baidu.com/')
  7. # 刷新页面
  8. browser.refresh()

5、前进和后退

(1)后退:browser.back()

(2)前进:browser.forward()

  1. from selenium import webdriver
  2. import time
  3. # 初始化浏览器为chrome浏览器
  4. browser = webdriver.Chrome()
  5. # 设置浏览器全屏
  6. browser.maximize_window()
  7. # 打开百度界面并等待2秒
  8. browser.get('https://www.baidu.com')
  9. time.sleep(2)
  10. # 打开淘宝页面并等待2秒
  11. browser.get('https://www.taobao.com')
  12. time.sleep(2)
  13. # 后退到百度页面并等待2秒
  14. browser.back()
  15. time.sleep(2)
  16. # 前进到淘宝页面并等待2秒
  17. browser.forward()
  18. time.sleep(2)
  19. # 关闭浏览器
  20. browser.close()

6、设置窗口大小

(1)全屏:browser.maximize_window()

(2)根据分辨率调整:browser.set_window_size(width, height)

  1. from selenium import webdriver
  2. import time
  3. # 初始化浏览器为chrome浏览器
  4. browser = webdriver.Chrome()
  5. # 设置浏览器大小:全屏
  6. browser.maximize_window()
  7. browser.get('https://www.baidu.com')
  8. time.sleep(2)
  9. # 设置分辨率 500*500
  10. browser.set_window_size(500, 500)
  11. time.sleep(2)
  12. # 设置分辨率 1000*800
  13. browser.set_window_size(1000, 800)
  14. time.sleep(2)
  15. # 关闭浏览器
  16. browser.close()

7、截屏

browser.get_screenshot_as_file('命名.png')

注意:这里截图的文件同当前文件在一个目录下

  1. from selenium import webdriver
  2. # 初始化浏览器为chrome浏览器
  3. browser = webdriver.Chrome()
  4. # 访问百度首页
  5. browser.get(r'https://www.baidu.com/')
  6. # 浏览器截图
  7. browser.get_screenshot_as_file('百度.png')
  8. # 关闭浏览器
  9. browser.close()

8、退出

browser.close()

  1. from selenium import webdriver
  2. import time
  3. # 初始化浏览器为chrome浏览器
  4. browser = webdriver.Chrome()
  5. # 访问百度首页
  6. browser.get(r'https://www.baidu.com/')
  7. time.sleep(10)
  8. # 关闭浏览器
  9. browser.close()

9、获取页面基础属性

通过selenium打开网页后,我们就能获取到页面的title标题,current_url网页地址,name浏览器名,page_source网页源码等内容

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.service import Service
  3. # 实例化
  4. browser = webdriver.Chrome()
  5. # 访问csdn首页
  6. browser.get('https://www.csdn.net/')
  7. # 浏览器标题
  8. title = browser.title
  9. print(title)
  10. # 浏览器地址
  11. url = browser.current_url
  12. print(url)
  13. # 浏览器名
  14. name = browser.name
  15. print(name)
  16. # 浏览器源码
  17. source = browser.page_source
  18. print(source)

二、定位页面元素

1、 打开指定页面

以熟知的百度为例,进入首页,按【F12】进入开发者工具,红框中显示的就是页面的代码,我们要做的就是从代码中定位获取我们需要的元素

想要定位并获取页面中的信息,首先要使用 `webdriver` 打开指定页面,再去定位,即下述代码

  1. from selenium import webdriver
  2. # Chrome浏览器
  3. driver = webdriver.Chrome()
  4. driver.get('https://www.baidu.com/')
  5. driver.maximize_window()
  6. # 保持浏览器窗口打开,等待手动关闭
  7. input("Press enter to exit...")

下面来看看几种常见的页面元素定位方式。

注意:通过webdriver对象的find_element_by_xx(" ")(在selenium的4.0版本中此种用法即将弃用,不推荐使用),要使用通过webdriver模块中的By,以指定方式定位元素

2、 id 定位

(1)含义:id属性值与位置匹配的第一个元素将被返回

(2)写法:browser.find_element(By.ID, 'xx') ---能够帮助我们获取到id为xx的元素

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.service import Service
  3. from selenium.webdriver.common.by import By
  4. browser = webdriver.Chrome()
  5. # 访问csdn首页
  6. browser.get('https://www.csdn.net/')
  7. # 获取csdn首页id为toolbar-search-input的搜索框,并且输入python
  8. browser.find_element(By.ID, 'toolbar-search-input').send_keys('Python')
  9. # selenium4.0前版本写法
  10. # browser.find_element_by_id('toolbar-search-input').send_keys('Python')

3、name 定位

(1)含义:名称属性值与位置匹配的第一个元素将被返回

(2)写法:browser.find_element(By.NAME, 'xx') ---能够帮助我们获取到name为xx的元素

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.service import Service
  3. from selenium.webdriver.common.by import By
  4. import time
  5. browser = webdriver.Chrome()
  6. # 访问百度首页
  7. browser.get('https://www.baidu.com/')
  8. ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/16c0d21ea881468aa7196a9dd9919aae~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1315&h=1006&s=85004&e=png&b=fdfdfd)
  9. # 获取百度首页name为wd的搜索框,并且输入python
  10. browser.find_element(By.NAME, 'wd').send_keys('Python')
  11. time.sleep(5)
  12. # selenium4.0前版本写法
  13. # browser.find_element_by_name('wd').send_keys('Python')

4、class 定位

(1)含义:具有匹配的类属性名称的第一个元素将被返回

(2)写法: browser.find_element(By.CLASS_NAME, 'xx') ---可以获取到网页中class名为xx的第一个元素

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.service import Service
  3. from selenium.webdriver.common.by import By
  4. import time
  5. browser = webdriver.Chrome()
  6. # 访问百度首页
  7. browser.get('https://www.baidu.com/')
  8. # 获取百度首页classname为s_ipt的搜索框,并且输入python
  9. browser.find_element(By.CLASS_NAME, 's_ipt').send_keys('Python')
  10. time.sleep(5)
  11. # selenium4.0前版本写法
  12. # browser.find_element_by_class_name('s_ipt').send_keys('Python')

5、 tag 定位

(1)含义:具有给定标签名称的第一个元素将被返回

(2)写法:browser.find_element(By.TAG_NAME, 'xx')

(3)注意:每个元素都有tag(标签)属性,如搜索框的标签属性,input是输入,table是表格等等,我们查看百度首页的html代码,可以看到有相同的Tag,很明显相同的tag太多,一般很少用tag来做定位

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.service import Service
  3. from selenium.webdriver.common.by import By
  4. browser = webdriver.Chrome()
  5. # 访问csdn首页
  6. browser.get('https://www.csdn.net/')
  7. # 获取csdn首页tag为h3的文本内容
  8. h = browser.find_element(By.TAG_NAME, 'h3').text
  9. print(h)
  10. # selenium4.0前版本写法
  11. # browser.find_element_by_tag_name('h3').text


6、link 定位

(1)含义:链接文本值与位置匹配的第一个元素将被返回

(2)写法:browser.find_element(By.LINK_TEXT, 'xx')

(3)下面例子为获取到百度首页左上角的新闻链接并触发点击事件

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. browser = webdriver.Chrome()
  5. # 访问百度首页
  6. browser.get('https://www.baidu.com/')
  7. # 获取百度首页link内容为新闻的链接,并点击
  8. browser.find_element(By.LINK_TEXT, '新闻').click()
  9. time.sleep(5)
  10. # selenium4.0前版本写法
  11. # browser.find_element_by_link_text('新闻').click()

7、partial_link 定位

(1)含义:具有部分链接文本值与位置匹配的第一个元素将被返回

(2)相当于link定位的模糊搜索方法,一般一个链接文本都很长,要是全部都输入就太麻烦了,所以我们只需要输入关键词来进行匹配即可

(3)写法:browser.find_element(By.PARTIAL_LINK_TEXT, 'xx')

(4)下面例子是用csdn的首页“下载·课程”来做示例,我们只需要定位“课程”,然后触发点击

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. browser = webdriver.Chrome()
  5. # 访问csdn首页
  6. browser.get('https://www.csdn.net/')
  7. # 获取csdn首页link内容为开发的模糊检索链接,并点击
  8. browser.find_element(By.PARTIAL_LINK_TEXT, '开发').click()
  9. time.sleep(5)
  10. # selenium4.0前版本写法
  11. # browser.find_element_by_partial_link_text('开发').click()

8、Xpath定位

(1)含义:xpath语法与位置匹配的第一个元素将被返回

(2)注意:前面介绍的id定位、name定位、tap定位、link定位都是比较理想化的定位方式,对于简单的网站来说使用起来效果不错,前提是这些内容都是唯一的,id唯一、name唯一、tap唯一、link内容唯一等,但是对于大型网站来说,就显得力不从心了,所以我们就要用更强大的定位工具xpath

(3)写法:browser.find_element(By.XPATH, "xx")

(4)xpath获取

  • 使用浏览器打开需测试的网址,然后点击【F12】按钮,打开开发者调试工具
  • 点击开发者工具中左上角的左上箭头,点击要定位元素,右侧会出现相关源代码
  • 在相关源代码上点击右键,Copy--->Copy Xpath,就获取到对应的Xpath了
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. browser = webdriver.Chrome()
  5. # 访问csdn首页
  6. browser.get('https://www.csdn.net/')
  7. # 获取csdn首页,通过xpath检索搜索框,并输入python内容
  8. browser.find_element(
  9.     By.XPATH, "//*[@id='toolbar-search-input']").send_keys('Python')
  10. time.sleep(5)
  11. # selenium4.0前版本写法
  12. # browser.find_element_by_xpath("//*[@id='toolbar-search-input']").send_keys('Python')


9、css 定位

(1)含义:具有匹配的CSS选择器的第一个元素将被返回

(2)写法:browser.find_element(By.CSS_SELECTOR, "#xx")   ----前面有个#号

(3)优点:使用CSS定位方法会比xpath更加简洁,效率更高

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. browser = webdriver.Chrome()
  5. # 访问csdn首页
  6. browser.get('https://www.csdn.net/')
  7. # 获取csdn首页,通过css写法,获取id为toolbar-search-input的搜索框
  8. browser.find_element(By.CSS_SELECTOR, "#toolbar-search-input") .send_keys('Python')
  9. time.sleep(5)
  10. # selenium4.0前版本写法
  11. # browser.find_element_by_css_selector('#toolbar-search-input').send_keys('Python')


三、鼠标控制

1、单击左键

(1)含义:模拟完成单击鼠标左键的操作,一般点击进入子页面等会用到,左键不需要用到 `ActionChains`

(2)写法:click()

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. browser = webdriver.Chrome()
  5. # 访问csdn首页
  6. browser.get('https://www.csdn.net/')
  7. # 获取csdn首页,通过css写法,获取id为toolbar-search-input的搜索框
  8. browser.find_element(By.CSS_SELECTOR, "#toolbar-search-input") .send_keys('Python')
  9. # 定位搜索按钮
  10. button = browser.find_element(By.XPATH,'//*[@id="toolbar-search-button"]/span')
  11. # 执行单击操作
  12. button.click()
  13. time.sleep(10)
  14. # selenium4.0前版本写法
  15. # browser.find_element_by_css_selector('#toolbar-search-input').send_keys('Python')

2、单击右键

(1)含义:鼠标右击的操作与左击有很大不同,需要使用 `ActionChains`

(2)写法:ActionChains(browser).context_click(button).perform()

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.common.action_chains import ActionChains
  4. import time
  5. browser = webdriver.Chrome()
  6. # 访问csdn首页
  7. browser.get('https://www.csdn.net/')
  8. # 定位搜索按钮
  9. button = browser.find_element(By.XPATH,'//*[@id="toolbar-search-button"]/span')
  10. # 右键搜索按钮
  11. ActionChains(browser).context_click(button).perform()
  12. time.sleep(10)
  13. # selenium4.0前版本写法
  14. # browser.find_element_by_css_selector('#toolbar-search-input').send_keys('Python')

3、双击

模拟鼠标双击操作

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.common.action_chains import ActionChains
  4. import time
  5. browser = webdriver.Chrome()
  6. # 访问csdn首页
  7. browser.get('https://www.csdn.net/')
  8. # 定位搜索按钮
  9. button = browser.find_element(By.XPATH,'//*[@id="toolbar-search-button"]/span')
  10. # 执行双击动作
  11. ActionChains(browser).double_click(button).perform()
  12. time.sleep(10)

4、拖动

模拟鼠标拖动操作,该操作有两个必要参数:

  • source:鼠标拖动的元素
  • target:鼠标拖至并释放的目标元素
  1. # 定位要拖动的元素
  2. source = driver.find_element(By.XPATH,'xxx')
  3. # 定位目标元素
  4. target = driver.find_element(By.XPATH,'xxx')
  5. # 执行拖动动作
  6. ActionChains(driver).drag_and_drop(source, target).perform()

5、鼠标悬停

模拟悬停的作用一般是为了显示隐藏的下拉框,如图

  1. # 定位前端栏
  2. collect  = browser.find_element(By.XPATH,'//*[@id="floor-nav_557"]/div/div/div/ul/li[2]/a')
  3. # 鼠标悬停至前端标签处
  4. ActionChains(browser).move_to_element(collect).perform()

四、键盘控制

1、前言

在 Selenium 模块中,提供了一个 Keys 类,来处理键盘操作

在 Selenium 模块中,使用 send_keys() 方法,来模拟键盘输入

  1. # 添加包
  2. from selenium.webdriver.common.keys import Keys

2、keys类常用方法

序号Keys类键盘事件实现功能
1Keys.BACK_SPACE删除键
2Keys.SPACE空格键
3Keys.TABTab键
4Keys.ESCAPE        回退键 
5Keys.ENTER回车键
6Keys.CONTROL,”a” 组合键,Ctrl + A
7Keys.CONTROL,”x”组合键,Ctrl + X
8Keys.CONTROL,”v”组合键,Ctrl + V
9Keys.CONTROL,”c”组合键,Ctrl + C
10Keys.F1/F12F1/F12键
11Keys.SHIFT 大小写转换键
12Keys.CONTROL Control键
13Keys.ALTALT键
14Keys.PAGE_UP翻页键上
15Keys.PAGE_DOWN翻页键下
16Keys.END行尾键
17Keys.HOME行尾键
18Keys.LEFT方向键左
19Keys.UP方向键上
20Keys.RIGHT 方向键右
21Keys.DOWN方向键下
22Keys.INSERT 插入键
23Keys.NUMPAD0 ~ NUMPAD9 数字键1-9

3、操作案例

(1)需求描述:

打开百度浏览器 输入python , Ctrl+a-全选 , Ctrl+x-剪切 , Ctrl+v-粘贴,按下回车键

(2)代码

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.common.keys import Keys
  5. browser = webdriver.Chrome()
  6. browser.get("http://baidu.com/")
  7. # 定位到输入框
  8. inputBaidu = browser.find_element(By.ID, 'kw')
  9. # 在输入框输入python
  10. inputBaidu.send_keys("python")
  11. inputBaidu.send_keys(Keys.SPACE)  # 再输入一个空格
  12. time.sleep(3)
  13. inputBaidu.send_keys(Keys.CONTROL, 'a')  # Ctrl+a 模拟全选
  14. time.sleep(3)
  15. inputBaidu.send_keys(Keys.CONTROL, 'x')  # Ctrl+x 模拟剪切
  16. time.sleep(3)
  17. inputBaidu.send_keys(Keys.CONTROL, 'v')  # Ctrl+v 模拟粘贴
  18. time.sleep(3)
  19. inputBaidu.send_keys(Keys.ENTER)  # 模拟回车
  20. time.sleep(3)


(3)实现效果:

这里暂不展示了,感兴趣的小伙伴可以手动操作下,查看效果


五、切换句柄

1、前言

有些网站页面在点开链接后会出现新的窗口,但是浏览器对象 browser(driver) 还是之前页面的对象,针对此问题,需要切换到不同的窗口进行操作,Selenium 模块提供了 switch_to.window() 方法-切换句柄 和 window_handles 属性-获取句柄列表

2、方法

(1)获取当前窗口句柄:`browser.current_window_handle`

(2)获取所有句柄:`browser.window_handles`

(3)切换句柄:`browser.switch_to.window()`

(4)关闭当前句柄:`browser.close()`

(5)关闭浏览器:`browser.quit()`

3、使用流程

(1)先创建浏览器对象:browser = webdriver.Chrome()

(2)先获取当前所有句柄(列表):all_handles = browser.window_handles

(3)再切换到指定句柄(利用列表下标索引取值):browser.switch_to.window(all_handles[1])

4、实现案例

(1)需求描述

打开百度界面,点击界面左上角的新闻切换至新闻窗口

(2)代码:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. handles = []
  5. driver = webdriver.Chrome()
  6. driver.get('https://www.baidu.com/')
  7. time.sleep(5)
  8. # 获取当前窗口的句柄
  9. handles.append(driver.current_window_handle)
  10. # 点击 python,进入分类页面
  11. driver.find_element(By.XPATH,'//*[@id="s-top-left"]/a[1]').click()
  12. # 切换窗口
  13. driver.switch_to.window(driver.window_handles[1])
  14. time.sleep(5)
  15. # 获取当前窗口的句柄
  16. handles.append(driver.current_window_handle)
  17. print(handles)
  18. print(driver.window_handles)

(3)结果

上面代码在点击跳转后,使用 `switch_to.window` 切换窗口,`window_handles` 返回的 `handle` 列表是按照页面出现时间进行排序的,最新打开的页面肯定是最后一个,两次列表的抓取都不一致,说明已经跳转到最新页面了

五、切换操作

1、窗口切换

即第五章的切换窗口句柄

2、表单切换

(1)什么是表单:就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面

(2)前言:在web自动化测试中,我们经常会碰到frame表单嵌套结构,直接定位会报错,因此需要切换表单后才能成功定位,比如一个登录网站,如下图

webdriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位,这时就需要通过switch_to_frame()方法将当前定位的主体切换为内嵌表单


(3)方法:将当前定位的主体切换进表单后再进行定位

  • driver.switch_to.frame()--------------------切换进表单
  • driver.switch_to.default_content()---------跳回最外层的页面
  • driver.switch_to.parent_frame()------------跳回上层的页面

(4)举例说明

以邮箱为例,先定位到表单,再切换进入表单,定位账号、密码并输入,点击登陆

代码如下:
 

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. driver = webdriver.Chrome()
  5. driver.get('http://126.com/')
  6. # 界面最大化
  7. driver.maximize_window()
  8. # 防止加载太快
  9. time.sleep(5)
  10. # 定位到表单
  11. el_frame = driver.find_element(By.TAG_NAME,'iframe')
  12. # 切换进入表单中
  13. driver.switch_to.frame(el_frame)
  14. # 在表单中定位账号输入框
  15. el_user = driver.find_element(By.NAME,'email')
  16. # 输入账号(自己的账号)
  17. el_user.send_keys('1234567')
  18. # 定位密码输入框标签
  19. el_pwd = driver.find_element(By.NAME,'password')
  20. # 输入密码(自己的密码)
  21. el_pwd.send_keys('8765tre')
  22. # 定位登陆按钮
  23. el_sub = driver.find_element(By.ID,'dologin')
  24. # 点击登录
  25. el_sub.click()
  26. time.sleep(5)
  27. driver.close()

结果图如下:

六、弹窗处理

1、JavaScript三种弹出对话框的简单介绍

JavaScript的三种对话框是通过调用 "window对象" 的三个方法 "alert()"、"confirm()" 、"prompt()" 来获得,我们可以利用这些对话框来完成 "js" 的输入和输出,实现与用户进行交互的js代码

(1)alert() - 警告框

定义:alert是一个警告框,表现为直接弹出一个提示窗,该提示窗只有一个按钮确定按钮,点击【确定】按钮后无返回值,alert警告框经常被用于确保用户可以得到某些信息;当警告框出现后,用户需要点击确定按钮才能继续进行操作

语法:alert("文本")

代码示例:

  1. <html>
  2. <head>
  3. <title></title>
  4. <a id="tooltip" href="#" data-toggle="tooltip" title="这是一个警告框" onclick="alert(this.title);">点击(弹出警告)</a>
  5. </head>
  6. </html>

(2)confirm() - 确认框

定义:confirm是确认框,它有两个按钮,确定 与 取消 ,返回 true 或 false 。确认框用于让用户可以验证或者接受某些信息。当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。如果用户点击确认,那么返回值为 true;如果用户点击取消,那么返回值为 false。

语法:confirm("文本")

代码示例:

  1. <html>
  2. <head>
  3. <title>confirm</title>
  4. </head>
  5. <body>
  6. <script language="JavaScript">
  7. if(confirm("准备好了么?")){
  8. alert("准备好了!");
  9. }
  10. else{
  11. alert("不,我还需要再做些准备!");
  12. }
  13. </script>
  14. </body>
  15. </html>

(3)prompt() - 提示框

定义:prompt是提示框,它会返回输入框输入的消息,或者其默认值;提示框经常用于提示用户在进入页面前输入某个值。当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。如果用户点击确认,那么返回值为输入的值;如果用户点击取消,那么返回值为 null

语法:prompt("文本","默认值")

代码示例:

  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <script language='JavaScript' type="text/javascript" >
  6. var aa= prompt("你叫什么名字?","cendy");document.write("Welcome to my world, "+aa+"<br>")
  7. </script>
  8. </body>
  9. </html>

2、selenium 处理弹出对话框的常用方法

处理方法:首先选择到目标对话框,接着对对话框进行接受/取消/返回信息/输入文字等操作

常用方法如下:

  1. driver.switch_to.alert------------选择alert对话框
  2. text----------------------------------返回 alert、confirm、prompt 里面的文字信息
  3. accept------------------------------接受
  4. dismiss-----------------------------取消
  5. send_keys-------------------------向 prompt 里面输入文字
(1)selenium 处理 alert() 弹窗

弹窗页面同第1点

代码示例:

  1. from time import sleep
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.webdriver import WebDriver
  4. from selenium.webdriver.common.by import By
  5. driver: WebDriver = webdriver.Chrome() # 启动 Chrome浏览器的 driver
  6. driver.maximize_window() # Chrome 浏览器最大化
  7. sleep(2)
  8. driver.get('file:///F:/DEMO/alert.html') # 打开对应文件
  9. sleep(2)
  10. driver.find_element(By.ID,'tooltip').click() # 点击页面 id='tooltip' 的元素(会弹出alert)
  11. sleep(2)
  12. alert = driver.switch_to.alert # 选择 alert
  13. print(alert.text) # 打印输出 alert 的内容
  14. alert.accept() # 针对 alert 执行 accept(接受)方法
  15. sleep(2)
  16. driver.quit()

(2)selenium 处理 confirm() 弹窗

弹窗页面同第1点

代码示例:

  1. from time import sleep
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.webdriver import WebDriver
  4. from selenium.webdriver.common.alert import Alert
  5. driver: WebDriver = webdriver.Chrome() # 启动 Chrome浏览器的 driver
  6. driver.maximize_window() # Chrome 浏览器最大化
  7. sleep(2)
  8. driver.get('file:///F:/DEMO/confirm.html') # 打开对应文件
  9. sleep(2)
  10. # 下面是执行拒绝的方法
  11. confirm = driver.switch_to.alert # 不管是 alert 还是 confirm、prompt ,"switch_to" 的方式是一样的
  12. print(confirm.text) # 打印输出 "confirm" 的内容
  13. sleep(2)
  14. confirm.dismiss() # 针对 confirm 执行 dismiss(取消)方法
  15. sleep(2)
  16. confirm1 = driver.switch_to.alert
  17. print(confirm1.text)
  18. # 下面是执行接受的方法
  19. # alert = driver.switch_to.alert # 选择 confirm 执行 accept(接受)方法后的 alert
  20. # print(alert.text) # 打印输出 alert 的内容
  21. # sleep(2)
  22. # alert.accept() # 针对 alert 执行 accept(接受)方法
  23. # alert1 = driver.switch_to.alert
  24. # print(alert1.text)
  25. # sleep(2)
  26. driver.quit()

selenium 处理 confirm() 弹窗时,执行接受/取消的操作互相冲突,只能分批执行

上文的脚本中,我们通过 switch_to 的方法选择 alert 略显得麻烦一些,能不能直接通过 confirm 把它当成一个来处理呢——可以只选择一次,后续直接调用(减少了代码冗余)

话不多说,直接上代码

  1. from time import sleep
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.webdriver import WebDriver
  4. from selenium.webdriver.common.alert import Alert
  5. driver: WebDriver = webdriver.Chrome() # 启动 Chrome浏览器的 driver
  6. driver.maximize_window() # Chrome 浏览器最大化
  7. sleep(1)
  8. driver.get('file:///F:/DEMO/confirm.html') # 打开对应文件
  9. sleep(1)
  10. # 下面是执行拒绝的方法
  11. # confirm = driver.switch_to.alert # 不管是 alert 还是 confirm、cprompt ,"switch_to" 的方式是一样的
  12. # print(confirm.text) # 打印输出 "confirm" 的内容
  13. # sleep(1)
  14. # confirm.dismiss() # 针对 confirm 执行 dismiss(取消)方法
  15. # sleep(1)
  16. # print(confirm.text)
  17. # 下面是执行接受的方法
  18. confirm = driver.switch_to.alert # 不管是 alert 还是 confirm、cprompt ,"switch_to" 的方式是一样的
  19. print(confirm.text) # 打印输出 "confirm" 的内容
  20. confirm.accept() # 针对 alert 执行 accept(接受)方法
  21. print(confirm.text)
  22. sleep(1)
  23. driver.quit()
(3)selenium 处理 prompt() 弹窗

弹窗组件 - prompt(),页面可参考第1点,有一个输入框、两个按钮,可以选择确定或取消

代码示例:

  1. from time import sleep
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.webdriver import WebDriver
  4. from selenium.webdriver.common.alert import Alert
  5. driver: WebDriver = webdriver.Chrome() # 启动 Chrome浏览器的 driver
  6. driver.maximize_window() # Chrome 浏览器最大化
  7. sleep(1)
  8. driver.get('file:///F:/DEMO/prompt.html') # 打开对应文件
  9. sleep(1)
  10. prompt = driver.switch_to.alert # 不管是 alert 还是 confirm、cprompt ,"switch_to" 的方式是一样的
  11. print(prompt.text) # 打印输出 "confirm" 的内容
  12. sleep(1)
  13. prompt.send_keys('I LOVE YOU!') # "prompt.html" 文件默认输入框里传入的是 "cendy" ,这里我们传入 "I LOVE YOU!"
  14. prompt.accept()
  15. sleep(1)
  16. driver.quit()

从截图中我们可以看到打印输出的内容并没有我们输入的内容,与之前文章的 `send_keys` 不一样,这是因为它是 JavaScript 原生的东西,既然是原生的组件,我们是看不到它的输入过程的,只能是通过 webdriver 来控制它的底层来改变输入的元素内容。所以虽然输入正确,返回也正确,但是在过程中是看不出来的

七、上传&下载文件

1、上传文件

(1)流程

  • 启动浏览器
  • 打开目标网页
  • 定位文件上传元素
  • 输入文件路径
  • 提交上传

(2)代码举例:

  1. from time import sleep
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. driver = webdriver.Chrome()
  5. driver.maximize_window() # Chrome 浏览器最大化
  6. sleep(1)
  7. driver.get('file:///F:/DEMO/upload.html') # 打开对应文件
  8. sleep(1)
  9. # 定位文件上传元素
  10. upload = driver.find_element(By.XPATH,"/html/body/input")
  11. # 输入需要上传的文件路径
  12. upload.send_keys("F:/PY/demo/百度.png")
  13. # 定位提交按钮并上传
  14. upload_button = driver.find_element(By.TAG_NAME,'button')
  15. upload_button.click()
  16. sleep(5)
  17. driver.quit()

上传时,使用send_keys()方法向文件上传元素发送文件路径,其中"F:/PY/demo/百度.png"是待上传文件的路径

2、下载文件

(1)流程

  • 启动浏览器
  • 打开目标网页
  • 定位文件下载链接
  • 点击下载链接
  • 等待文件下载完成

(2)语法:

  • download.default_directory:设置下载路径
  • profile.default_content_settings.popups:0 禁止弹出窗口

(3)简单代码示例:

  1. from selenium import webdriver
  2. from time import sleep
  3. from selenium.webdriver.common.by import By
  4. driver = webdriver.Chrome()
  5. driver.maximize_window()
  6. #打开下载地址
  7. driver.get('https://pypi.org/project/selenium/#files')
  8. sleep(1)
  9. #点击下载链接下载
  10. driver.find_element(By.XPATH,'//*[@id="files"]/div[1]/div[2]/a[1]').click()
  11. sleep(10)
  12. driver.quit()

八、cookies操作/调用JavaScript

1、cookies操作

cookies是识别用户登录与否的关键,爬虫中常常使用 `selenium + requests` 实现 `cookie `持久化,即先用 `selenium` 模拟登陆获取 `cookie` ,再通过 `requests` 携带 `cookie` 进行请求。

webdriver 提供 cookies 的几种操作:读取、添加删除

  • get_cookies:以字典的形式返回当前会话中可见的 cookie 信息
  • get_cookie(name):返回 cookie 字典中 key == name 的 cokie 信息。
  • add_cookie(cookie_dict):将 cookie 添加到当前会话中
  • delete_cookie(name):删除指定名称的单个 cookie
  • delete_all_cookies():删除会话范围内的所有 cookie

代码示例:

  1. from selenium import webdriver
  2. driver = webdriver.Chrome()
  3. driver.get("https://blog.csdn.net/")
  4. # 输出所有cookie信息
  5. print(driver.get_cookies())
  6. cookie_dict = {
  7. 'domain': '.csdn.net',
  8. 'expiry': 1732604623,
  9. 'httpOnly': True,
  10. 'name': 'test',
  11. 'path': '/',
  12. 'secure': True,
  13. 'value': 'null'}
  14. # 添加cookie
  15. driver.add_cookie(cookie_dict)
  16. # 显示当前会话中可见的cookie信息
  17. print(driver.get_cookies())
  18. # 显示 name = '__gpi' 的cookie信息
  19. print(driver.get_cookie('c_ref'))
  20. # 删除 name = 'test' 的cookie信息
  21. driver.delete_cookie('test')
  22. # 删除当前会话中的所有cookie
  23. driver.delete_all_cookies()

2、调用JavaScript滑动滚动

webdriver 对于滚动条的处理需要用到JavaScript ,同时也可以向textarea文本框中输入文本(webdriver只能定位,不能输入文本),webdriver中使用execute_script方法实现JavaScript执行

(1)通过 x ,y 坐标滑动

对于这种通过坐标滑动的方法,我们需要知道起始位置在页面左上角(0,0)---很少用

 window.scrollTo(0,1000)-------# f(x,y) x:横坐标,y:纵坐标,单位:xp(像素点)

  1. from selenium import webdriver
  2. import time
  3. driver = webdriver.Chrome() # 初始化一个谷歌浏览器
  4. driver.maximize_window() # 浏览器窗口最大化
  5. driver.get("https://readhub.cn/topics") # 打开一个存在懒加载的网页
  6. time.sleep(5) # 等待一段时间,待页面加载出来再执行js代码
  7. # 方法一:坐标法
  8. driver.execute_script('window.scrollTo(0,1000)') # 横坐标不变,纵坐标 滚动到1000像素点
  9. time.sleep(2) # 等待一段时间,方便查看滚动的效果
  10. driver.execute_script('window.scrollTo(0,2000)') # 再滚动一次
  11. time.sleep(2) # 等待一段时间,方便查看滚动的效果
(2)滚动到窗口底部,然后定位要找的元素

window.scrollTo(0,document.body.scrollHeight) -------document.body.scrollHeight 当前窗口的高度

  1. from selenium import webdriver
  2. import time
  3. driver = webdriver.Chrome() # 初始化一个谷歌浏览器
  4. driver.maximize_window() # 浏览器窗口最大化
  5. driver.get("https://readhub.cn/topics") # 打开一个存在懒加载的网页
  6. time.sleep(5) # 等待一段时间,待页面加载出来再执行js代码
  7. # 方法二:滚动到窗口底部
  8. # 拉到底部,但是有新的加载就会退回到三分之二的位置;加载出来后又跳到四分之一的位置
  9. driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
  10. time.sleep(2) # 等待一段时间,方便查看滚动的效果
  11. driver.execute_script('window.scrollTo(0,document.body.scrollHeight)') # 再继续滚动
  12. time.sleep(2)
(3)将元素滚动到可视范围之内

场景:有时候元素在比较下面,需要先滚动下页面才能看到元素并点击

document.getElementById(“id”).scrollIntoView()

或者分成两行写:

el = document.getElementById(“id”)

el.scrollIntoView()

  1. from selenium import webdriver
  2. import time
  3. driver = webdriver.Chrome() # 初始化一个谷歌浏览器
  4. driver.maximize_window() # 浏览器窗口最大化
  5. driver.get("
  6. https://www.baidu.com/s?ie=UTF-8&wd=%E8%8A%B1%E9%9D%99%E9%80%B8") # 打开百度搜索“白桃乌龙”的结果
  7. time.sleep(5) # 等待一段时间,待页面加载出来再执行js代码
  8. # document.getElementsByClassName("pc")[1] # js指令:百度搜索结果页,定位页面底部翻页的元素“2”
  9. driver.execute_script('document.getElementsByClassName("pc")[1].scrollIntoView()')
  10. time.sleep(5)
  11. # 或者分成两行写
  12. # driver.execute_script('el = document.getElementsByClassName("pc")[1]')
  13. # driver.execute_script('el.scrollIntoView()')

 注意:mentsByClassName 定位到的是一组元素,我们需要通过索引(从0开始)来取到元素“2”

九、其他操作

1、关闭所有页面

使用 quit()`方法可以关闭所有窗口并退出驱动程序

driver.quit()

2、关闭当前页面

使用 close()方法可以关闭当前页面,使用时要注意 “当前页面” 这四个字,当你关闭新打开的页面时,需要切换窗口才能操作新窗口并将它关闭。

  1. from selenium import webdriver
  2. from time import sleep
  3. from selenium.webdriver.common.by import By
  4. driver = webdriver.Chrome()
  5. driver.get('https://blog.csdn.net/')
  6. driver.implicitly_wait(3)
  7. # 点击进入新页面
  8. driver.find_element(By.XPATH,'//*[@id="floor-blog-index_747"]/div/div[1]/div[1]/div[1]/div/div/div[1]/a/p[1]/span').click()
  9. # 切换窗口
  10. # driver.switch_to.window(driver.window_handles[-1])
  11. sleep(5)
  12. driver.close()

不切换窗口时,`driver` 对象还是操作最开始的页面

3、对当前页面进行截图

(1)理解:wendriver中使用get_screenshot_as_file()对 “当前页面” 进行截图,这里和上面的 `close()` 方法一样,对于新窗口的操作,一定要切换窗口,不然截的还是原页面的图。对页面截图这一功能,主要用在我们测试时记录报错页面的,我们可以将 try except 结合 get_screenshot_as_file()`一起使用来实现这一效果

(2)举例说明:

  1. from selenium import webdriver
  2. from time import sleep
  3. from selenium.webdriver.common.by import By
  4. driver = webdriver.Chrome()
  5. driver.get('https://blog.csdn.net/')
  6. driver.implicitly_wait(3)
  7. # 点击进入新页面
  8. driver.find_element(By.XPATH,'//*[@id="floor-blog-index_747"]/div/div[1]/div[1]/div[1]/div/div/div[1]/a/p[1]/span').click()
  9. # 切换窗口
  10. driver.switch_to.window(driver.window_handles[-1])
  11. # 截图
  12. driver.get_screenshot_as_file(r'F:\PY\img\text.png')
  13. sleep(5)
  14. driver.close()

(3)主要应用在下面例子:

  1. try:
  2. driver.find_element_by_xpath('//*[@id="mainContent"]/aside/div[1]/div').click()
  3. except:
  4. driver.get_screenshot_as_file(r'C:\Users\pc\Desktop\screenshot.png')

4、常用方法总结

  1. # 获取当前页面url
  2. driver.current_url
  3. # 获取当前html源码
  4. driver.page_source
  5. # 获取当前页面标题
  6. driver.title
  7. # 获取浏览器名称(chrome)
  8. driver.name
  9. # 对页面进行截图,返回二进制数据
  10. driver.get_screenshot_as_png()
  11. # 设置浏览器尺寸
  12. driver.get_window_size()
  13. # 获取浏览器尺寸,位置
  14. driver.get_window_rect()
  15. # 获取浏览器位置(左上角)
  16. driver.get_window_position()
  17. # 设置浏览器尺寸
  18. driver.set_window_size(width=1000, height=600)
  19. # 设置浏览器位置(左上角)
  20. driver.set_window_position(x=500, y=600)
  21. # 设置浏览器的尺寸,位置
  22. driver.set_window_rect(x=200, y=400, width=1000, height=600)

大概就是这么多东西了,后续可继续补充!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/111643
推荐阅读
相关标签
  

闽ICP备14008679号