qzdlp

 网页自动化

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

分类:

技术点:

相关文章:

  • 2022-02-08
  • 2022-12-23
  • 2022-01-08
  • 2021-12-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-12
  • 2022-02-11
  • 2022-12-23
  • 2021-12-05
  • 2021-11-04
  • 2022-12-23
  • 2021-09-19
相关资源
相似解决方案