python网页自动化

 网页自动化

1.环境配置

1.1 python3安装,去官网安装,要安装大的,小的安装包可能没有script文件目录,没有安装pip

1.2 pycharm安装,安装后配置python版本,以及知道如何添加安装模块

1.3 selenium安装 在pycharm的终端terminal中执行pip install selenium

1.4 安装浏览器内核驱动webdriver,chrome的驱动chromedriver.exe,注意自己的浏览器对应驱动版本,将exe程序放到python的script目录下

2.浏览器启动

2.1 普通方式启动

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')

2.2 无界面启动

# -*- coding: utf-8 -*-
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('disable-gpu')
driver = webdriver.Chrome(options=chrome_options)
driver.get('http://www.baidu.com')

我的chrome未实现,因为版本是49,比较老的版本,在widows系统中使用无界面版本需要chrome版本60+。

2.3 加载配置启动浏览器

因为老版本有许多功能不支持,以免影响后面的实验效果,所以将chrome的版本升到60+。在升级之前先备份老版本网页书签,又想到老版本的书签网页有些网页是记录登录状态的,所以备份书签url和账号密码,还需要准备相应的webdriver.老版本是zip文件解压后直接使用,不是exe安装包,所以启动时需配置binary_location,如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
options = webdriver.ChromeOptions()
options.binary_location = r"D:\用户目录\下载\Chrome6103163100x86\GoogleChrome_61.0.3163.100_x86\ChromePortable\ChromePortable.exe"
driver = webdriver.Chrome(options=options)
driver.get('https://www.cnblogs.com/qzdlp/')

再来实现无界面启动:

# -*- coding: utf-8 -*-
from selenium import webdriver
options = webdriver.ChromeOptions()

chrome_options.add_argument('--headless')
chrome_options.add_argument('disable-gpu')
options.binary_location = r"D:\用户目录\下载\Chrome6103163100x86\GoogleChrome_61.0.3163.100_x86\ChromePortable\ChromePortable.exe"
driver = webdriver.Chrome(options=options)
driver.get('https://www.cnblogs.com/qzdlp/')
print(f"browser text = {driver.page_source}")
driver.quit()

输入账号和密码启动:

uname = 'xxxx'
passd = 'xxxx'
driver.find_element_by_class_name('uname').send_keys(uname)
sleep(1)
driver.find_element_by_class_name('passd').send_keys(passd)
sleep(1)
driver.find_element_by_class_name('tijiao').click()
sleep(1)
code

怎么加cookie?

driver = webdriver.Chrome()
# 要先访问一次这个域名
driver.get('https://aso100.com')

for item in cookie_list: driver.add_cookie({
    'domain': '.aso100.com',
    'name': item['name'],
    'value': item['value'],
    'path': '/',
    'expires': None
})

driver.get('https://aso100.com/account/setting/type/dataCenter')
input('是否有效')
driver.close()
driver.quit()

3.定位元素:(以baidu.com为例)

根据id定位 find_element_by_id(‘id’)

driver.find_element_by_id('kw').send_keys('selenium')

name定位 find_element_by_name()

driver.find_element_by_name('wd').send_keys('selenium2')

class定位find_element_by_class_name()

driver.find_element_by_class_name('s_ipt').send_keys('123')

link定位:find_element_by_link_text()

driver.find_element_by_link_text('2')

partial link定位:find_element_by_partial_link_text()

driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")

tag定位:find_element_by_tag_name()

elements = driver.find_element_by_tag_name('input')

这样定位得是第一个第一个input,如果想定位到输入框有一个思路,使用driver.find_elements_by_tag_name('input')返回一个列表,再蒋输入框的input取出来。

driver.find_elements_by_tag_name('input')[7].send_keys('3333')

css定位:find_element_by_css_selector()

driver.find_element_by_css_selector("#kw").send_keys("selenium")

4.含有空格的解决方法

4.1 先来了解一下driver.switch_to.frame(),这个可以定位到指定的框架,取框架内的内容

4.2 空格的解决方案,定位一半或采用css的方式(CSS空格使用.代替)

driver.find_element_by_class_name("dlemail").send_keys("yoyo")

driver.find_element_by_css_selector(".j-inputtext.dlemail").send_keys("yoyo")

5. 等待分为三种强制等待,隐形等待,显性等待

5.1 强制等待 就是这样死板的time.sleep(1)

5.2 隐形等待implicitly_wait(),智能一点,就是设置一个最大时间,如果上一步加载完成,则下一步,否则把时间用完

5.3 显性等待

WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))

6.浏览器操作

浏览器大小操作分为浏览器最大化、最小化、指定大小

driver.maximize_window()

driver.minimize_window()

driver.set_window_size(480, 800)

浏览器前进和后退操作

driver.forword()和driver.back()

7.操作对象的方法

操作对象的方法如点击某个连接、发送内容、清楚内容、提交、获取文本

Click send_keys clear submit text

8.键盘事件

什么时候用到,比如登录框时,可以通过find_element找到提交按钮,click一下。也可以输入账号密码后,按下回车键。

这种类型可以划分为单键的键盘事件,相对的还有一种组合键的键盘事件,比如复制和粘贴,以下2个例子说明:

单键提交,以百度登录为例:

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import  sleep
from selenium.webdriver.common.keys import Keys
options = webdriver.ChromeOptions()
options.binary_location = r"D:\用户目录\下载\Chrome6103163100x86\GoogleChrome_61.0.3163.100_x86\ChromePortable\ChromePortable.exe"
driver = webdriver.Chrome(options=options)
driver.get('https://www.baidu.com/')
driver.find_element_by_link_text('登录').click()
sleep(2)
driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click()
sleep(1)
driver.find_element_by_id('TANGRAM__PSP_10__userName').send_keys('11222')
driver.find_element_by_id('TANGRAM__PSP_10__password').send_keys('22222')
sleep(1)
driver.find_element_by_id('TANGRAM__PSP_10__password').send_keys(Keys.ENTER)

组合键:

#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')

9鼠标事件

鼠标事件包括右键、双击、拖动、移动鼠标到某个元素上,需要导入ActionChains类

from selenium.webdriver.common.action_chains import ActionChains

ActionChains类有5个方法

perform()  执行所有ActionChains 中存储的行为;

context_click()  右击;

double_click()   双击;

drag_and_drop()  拖动;

move_to_element()  鼠标悬停。

除了以上的鼠标操作,还有一种常用的click()点击类型context_click()

双击:

#定位到要双击的元素
 qqq =driver.find_element_by_xpath("xxx")
#对定位到的元素执行鼠标双击操作
 ActionChains(driver).double_click(qqq).perform()

拖曳:

#定位元素的原位置
element = driver.find_element_by_name("source")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("target")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()

9.多层框架/层级定位的问题

browser.switch_to_frame("f1")

browser.switch_to_window("f1")

10.判断常与显性等待配合使用

title_is: 判断当前页面的title是否精确等于预期
title_contains: 判断当前页面的title是否包含预期字符串
presence_of_element_located:判断某个元素是否被加到了dom树里,并不代表该元素一定可见
visibility_of_element_located:判断某个元素是否可见.可见代表元素非隐藏,并且元素的宽和高都不等于0
visibility_of:跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
presence_of_all_elements_located:判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True
text_to_be_present_in_element:判断某个元素中的text是否包含了预期的字符串
text_to_be_present_in_element_value:判断某个元素中的value属性是否包含了预期的字符串
frame_to_be_available_and_switch_to_it:判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
invisibility_of_element_located:判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable:判断某个元素中是否可见并且是enable的,这样的话才叫clickable
staleness_of:等某个元素从dom树中移除,注意,这个方法也是返回True或False
element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be:判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be:跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
alert_is_present:判断页面上是否存在alert,这是个老问题,很多同学会问到

Python Webdriver Exception速查表

Xpath&Css定位方法速查表

https://www.jianshu.com/p/1531e12f8852

代码美化工具

https://carbon.now.sh

实例:https://www.cnblogs.com/qzdlp/p/12168286.html

posted @ 2020-01-10 14:28  强壮的脸皮  阅读(3015)  评论(0编辑  收藏  举报