Selenium+Python环境配置
linux 挂机python程序详解
selenium 是一套完整的web应用程序自动化测试系统。
安装步骤:
- 安装selenium: pip3 install selenium
- 安装webdriver:
Chrome: http://chromedriver.storage.googleapis.com/index.html
Chromium: sudo apt-get install chromium-chromedriver
Firefox: https://github.com/mozilla/geckodriver/releases/
注:webdriver需要和对应的浏览器版本以及selenium版本对应。 - webdriver安装路径
Win: 复制webdriver到python安装目录下
Linux/Mac: 复制webdriver到/usr/local/bin下
Selenium基本操作及元素定位
启动浏览器
启动Chrome浏览器
code
1 2 3 4 | from selenium import webdriver driver = webdriver.Chrome() driver.get('http://xxx.com') |
启动Chromium浏览器
code
1 2 3 4 5 | from selenium import webdriver # apt-get安装webdriver路径 driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver') driver.get('http://xxx.com') |
指定驱动路径启动
code
1 2 3 4 5 6 7 | from selenium import webdriver # 驱动文件路径 driver_path = r'D:\download\chromedriver.exe' driver = webdriver.Chrome(executable_path=driver_path) driver.get('http://xxx.com') |
Headless方式启动
Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序。code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from selenium import webdriver # 不显示图形化界面 option = webdriver.ChromeOptions() # 增加无界面选项 option.add_argument("--headless") # 如果不增加这个选项,有时定位会出问题 option.add_argument("--disable-gpu") # 让Chrome在root权限下跑 option.add_argument('--no-sandbox') option.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome(chrome_options=option) driver.get('http://xxx.com') |
元素定位
id定位:find_element_by_id()
code
1 2 | # 通过id定位,并输入值selenium driver.find_element_by_id('kw').send_keys('selenium') |
name定位: find_element_by_name()
code
1 2 | # 通过name定位,并输入值selenium driver.find_element_by_name('wd').send_keys('selenium') |
class定位:find_element_by_class_name()
code
1 2 | # 通过class定位,并输入值selenium driver.find_element_by_class('wd').send_keys('selenium') |
tag定位:find_element_by_tag_name()
HTML是通过tag来定义功能的,比如input是输入,table是表格。
code
1 2 | # 通过tag定位,并输入值selenium driver.find_element_by_tag('input').send_keys('selenium') |
link定位:find_element_by_link_text()
此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“地图”等链接。
code
1 2 | # 通过link定位"新闻"这个链接并点击 driver.find_element_by_link_text('新闻').click() |
partial_link定位:find_element_by_partial_link_text()
有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
code
1 2 | # 通过partial_link定位"新闻"这个链接并点击 driver.find_element_by_partial_link_text('闻').click() |
xpath定位:find_element_by_xpath()
code
1 2 | # 通过xpath定位搜索框,并输入selenium driver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium') |
CSS定位:find_element_by_css_selector()
code
1 2 | # 通过CSS定位搜索框,并输入selenium driver.find_element_by_css_selector('#kw').send_keys('selenium') |
jQuery定位
基础语法是(selector).action()(selector).action()符号定义jQuery,selector选择器用来查询具体的HTML元素,通过action()来执行对元素的具体操作。
其中我们经常用到的action()在jq中有这么几种:
- $(selector).val(‘input_value’) 其中input_value表示要输入的文本的值
- $(selector).val(‘’) 如果为空,则执行后是清空的意思
- $(selector).click()
code
1 2 3 4 | search_jq = "$('#kw').val('selenium')" button_jq = "$('.s_btn').click()" driver.execute_script(search_jq) driver.execute_script(button_jq) |
Selenium三种等待方式
有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间。
强制等待
强制等待:不管浏览器是否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码。
code
1 2 3 4 5 6 7 | from selenium import webdriver import time driver = webdriver.Chrome() driver.get('http://xxx.com') time.sleep(3) |
隐形等待
隐性等待:通过添加 implicitly_wait() 方法就可以在一个时间范围内智能的等待。
隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。
隐性等待对整个driver的周期都起作用,所以只要设置一次即可。
code
1 2 3 4 5 6 7 | from selenium import webdriver driver = webdriver.Chrome() # 最长等待30s driver.implicitly_wait(30) driver.get('http://xxx.com') |
显性等待
显性等待:WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔n秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
浏览器操作
浏览器最大化、最小化
code
1 2 | driver.maximize_window() driver.minimize_window() |
设置窗口大小
code
1 2 | # 宽480,高800 driver.set_window_size(480,800) |
前进后退
code
1 2 | driver.forword() driver.back() |
浏览器标签页跳转
code
1 2 3 4 | from selenium.webdriver.common.action_chains import ActionChains # 打开新的页面之后 driver.switch_to.window(driver.window_handles[1]) |
操作测试对象
webdriver 中比较常用的操作对象的方法有下面几个:
- click:点击对象
- send_keys:在对象上模拟按键输入
- clear:清除对象的内容,如果可以的话
- submit:提交对象的内容,如果可以的话
- text:用于获取元素的文本信息
鼠标时间
鼠标事件一般包括鼠标右键、双击、拖动、移动鼠标到某个元素上等等。
code
1 2 3 4 5 6 7 8 9 10 11 | from selenium.webdriver.common.action_chains import ActionChains # ActionChains 常用方法: # perform() 执行所有ActionChains 中存储的行为 # context_click() 右击 # double_click() 双击 # drag_and_drop() 拖动 # move_to_element() 鼠标悬停 # 将鼠标移动到页面绝对位置并点击 ActionChains(driver).move_by_offset(100, 230).click().perform() |
多层框架、层级定位
定位元素过程中经常会遇到找不到元素的问题,出现该问题一般都是以下因素导致:
- 元素定位方法不对
- 页面存在iframe或内嵌窗口
- 页面超时
webdriver 提供了一个 switch_to_frame 方法,可以很轻松的来解决这个问题。code
1 | driver.switch_to_frame("f1") |
关闭浏览器
code
1 | driver.quit() |
使用shell脚本运行网页自动化程序
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #! /bin/bash # 进入脚本文件路径 cd /home/pi/autoWeb # 记录调用时间 echo $(date "+%Y-%m-%d %H:%M:%S") >> /home/pi/autoWeb/log.txt python3 autoWeb_c.py echo "Complete the form - cui" >> /home/pi/autoWeb/log.txt # shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败 if [$? -ne 0]; then echo "fail: cui" >> /home/pi/autoWeb/log.txt else python3 autoWeb_l.py echo "Complete the form - liu" >> /home/pi/autoWeb/log.txt fi echo "" >> /home/pi/autoWeb/log.txt |
Linux执行定时任务:Cron
linux内置的cron进程能帮我们实现定时任务。code
1 2 3 | crontab -e (编辑工作表) crontab -l (列出工作表里的命令) crontab -r (删除工作作) |
crontab -e进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。
crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种。code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 实例1:每1分钟执行一次myCommand * * * * * myCommand # 实例2:每小时的第3和第15分钟执行 3,15 * * * * myCommand # 实例3:在上午8点到11点的第3和第15分钟执行 3,15 8-11 * * * myCommand # 实例4:每隔两天的上午8点到11点的第3和第15分钟执行 3,15 8-11 */2 * * myCommand # 实例5:每周一上午8点到11点的第3和第15分钟执行 3,15 8-11 * * 1 myCommand # 实例6:每晚的21:30重启smb 30 21 * * * /etc/init.d/smb restart |
设置每天凌晨十二点十分调用网页自动化脚本
code
1 | 10 00 * * * /home/pi/autoWeb/autoWeb.sh |
重启cron服务
code
1 | service cron restart |