Selenium+Python环境配置

linux 挂机python程序详解

selenium 是一套完整的web应用程序自动化测试系统。

安装步骤:

  1. 安装selenium: pip3 install selenium
  2. 安装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版本对应。
  3. 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')

此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“地图”等链接。
code

1
2
# 通过link定位"新闻"这个链接并点击
driver.find_element_by_link_text('新闻').click()

有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
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中有这么几种:

  1. $(selector).val(‘input_value’) 其中input_value表示要输入的文本的值
  2. $(selector).val(‘’) 如果为空,则执行后是清空的意思
  3. $(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()

多层框架、层级定位

定位元素过程中经常会遇到找不到元素的问题,出现该问题一般都是以下因素导致:

  1. 元素定位方法不对
  2. 页面存在iframe或内嵌窗口
  3. 页面超时

webdriver 提供了一个 switch_to_frame 方法,可以很轻松的来解决这个问题。code

1driver.switch_to_frame("f1")

关闭浏览器

code

1driver.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

110 00 * * * /home/pi/autoWeb/autoWeb.sh

重启cron服务
code

1service cron restart

python

本文由 泓源视野 作者:admin 发表,其版权均为 泓源视野 所有,文章内容系作者个人观点,不代表 泓源视野 对观点赞同或支持。如需转载,请注明文章来源。

发表评论

Protected with IP Blacklist CloudIP Blacklist Cloud

您是第8239935 位访客, 您的IP是:[3.230.1.126]