selenium基础学习笔记

简介:Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

一、浏览器驱动

1. 不同的浏览器需要不同的驱动,这里给出几个常用的浏览器驱动地址

Firefox浏览器驱动

https://github.com/mozilla/geckodriver/releases

Chrome浏览器驱动

  1. 需要翻墙
    https://sites.google.com/a/chromium.org/chromedriver/downloads
  1. 镜像站
    http://npm.taobao.org/mirrors/chromedriver/

Edge浏览器驱动

https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

PhantomJs浏览器驱动

http://phantomjs.org/

2. 安装

(首先你需要安装selenium这个库)

pip3 install selenium

以chromedriver为例

在window下直接将chromedriver.exe 文件拖到 Python 的 Scripts 目录下

验证安装
在这里插入图片描述

运行如下代码

from selenium import webdriver
browser = webdriver.Chrome()

弹出一个空白的浏览器框 即安装成功

二、元素定位

Selenium提供了8种定位方式。

  • id
  • name
  • class name
  • tag name
  • link text
  • partial link text
  • xpath
  • css selector

这8种定位方式在Python selenium中所对应的方法为:

  • find_element_by_id()
  • find_element_by_name()
  • find_element_by_class_name()
  • find_element_by_tag_name()
  • find_element_by_link_text()
  • find_element_by_partial_link_text()
  • find_element_by_xpath()
  • find_element_by_css_selector()

三、Webdriver常用操作

定位到元素后可以进行操作,点击、输入

  1. 文本框元素可输入
browser.find_element_by_id('kw').send_keys('python')
//即把python输入文本框
  1. 清除文本
browser.find_element_by_id('kw').clear()
//清空输入的元素
  1. 点击元素
browser.find_element_by_id('su').click()

例:

from selenium import webdriver

url = 'https://www.baidu.com'
browser = webdriver.Chrome()
browser.get(url)
browser.find_element_by_id('kw').send_keys('python')
browser.find_element_by_id('kw').clear()
browser.find_element_by_id('kw').send_keys('C++')
browser.find_element_by_id('su').click()

全过程截图:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  1. 表单提交

上例的click()可用submit()替换

submit()仅限于表单提交

click()的应用更广泛

  1. 返回文本
text = driver.find_element_by_id("u1").text
print(text)

注:网页源代码用selenium打开和自己手动打开会有区别!!千万注意!!

返回为此处的文本
在这里插入图片描述

  1. 返回元素的属性值

id、 name、 type 或其他任意属性

attribute = driver.find_element_by_id("su").get_attribute('value')
print(attribute)

打印百度一下按钮的value值
在这里插入图片描述

四、鼠标事件

提到鼠标事件就一定要说ActionChains,ActionChains类里面的操作十分多,这里就只粗略地记一些鼠标操作

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

  • context_click(): 右击;
  • double_click(): 双击;
  • drag_and_drop(): 拖动;
  • move_to_element(): 鼠标悬停。

以click()为例

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")

name = browser.find_element_by_name("tj_trnews")    #找到百度新闻这个元素
actions = ActionChains(browser)     
actions.click(name).perform()   #perform函数是必须的,与普通的cilck指令不同,这里没有perform就不会跳转到新闻界面

五、键盘事件

首先要导入keys类

from selenium.webdriver.common.keys import Keys

以下为常用的键盘操作:

  • send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
  • send_keys(Keys.SPACE) 空格键(Space)
  • send_keys(Keys.TAB) 制表键(Tab)
  • send_keys(Keys.ESCAPE) 回退键(Esc)
  • send_keys(Keys.ENTER) 回车键(Enter)
  • send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
  • send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
  • send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
  • send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
  • send_keys(Keys.F1) 键盘 F1
  • ……
  • send_keys(Keys.F12) 键盘 F12

六、元素等待

  1. 隐式等待

当Selenium在DOM中没有找到节点,就继续等待,超出特定时间后则抛出找不到节点的异常,等待时间默认为0。但是只规定了一个固定时间,而页面的加载时间受网络条件影响,我们并不能知道具体的加载时间,这个固定时间很难设置。

  1. 显式等待

指定一个最长等待时间,只要在等待时间之内能加载出该节点,那么就结束等待,否则抛出超时异常。

实践

爬取五律协同观题库

import requests
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
import re
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def answer(url):
    browser.get(url)
    var = 1
    total =[]
    while(var==1):
        try:
            question = browser.find_element_by_xpath('/html/body/div/div/p')
            total.append(question.text)
            total.append('\n')
            texts = browser.find_elements_by_xpath('/html/body/div/div/div[1]/p')  # 用于保存题目
            for i in texts:
                total.append(i.text)
                total.append('\n')
            for i in browser.find_elements_by_xpath('/html/body/div/div/div[1]/p[1]'):  #模拟点击A选项
                i.click()
            button2 = browser.find_element_by_class_name('ensure')  #模拟点击确认
            button2.click()
            wait = WebDriverWait(browser,10)
            button3 = wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'next'))) #显式等待直到可以点击该元素 “下一题”
            button3.click()
            correct = browser.find_element_by_class_name('correct').get_attribute('style')
            print(correct)
            if correct == 'display: block;':
                total.append('答案:A')
                total.append('\n')
            else:
                answers = browser.find_element_by_xpath('/html/body/div/div/div[4]/p[2]/span')
                total.append('答案:')
                total.append(answers.text)
                total.append('\n')
            time.sleep(1)
        except Exception:   #无法点击下一题的时候开始另一个题库的爬取
            var=2
            f = open('question_bank.txt','a')
            for i in total:
                f.write(i)
            f.close()

browser = webdriver.Chrome()
# 设置网站等待时间
wait = WebDriverWait(browser, 10)
url='http://www.bigcourse.cn/p/login.aspx'
session = requests.Session()
browser.get(url)
html = browser.page_source
time.sleep(3)
url="http://www.bigcourse.cn/m/my/grouplist.aspx?groupid=22"
browser.get(url)
response=browser.page_source

result = re.findall('<li "go\(\'(.*?)\'\)"',response)
for i in result:
    answer(i)

在这里插入图片描述

------------------------------分割线------------------------------

目前的程序只能做到登录微信(账号是微信),不过这个登陆是手动扫码,但是不知道如何直接用微信接口登陆,还没找到什么好的方法。其次是模拟自动做题,然后爬取题目,根据反馈得到答案,数据并没有很好的管理方式,用数组存的然后写入txt

总共766题

爬取时间30-40分钟

部分题目并未爬取到答案(未知情况)

--------------------------------更新--------------------------------

部分未爬取到是因为爬取顺序出错,先点了下一题才开始爬题目,有的时候因为刷新太快导致没有来得及爬取到

修改顺序后要在点击确认之后暂停一下,让答案加载,否则无法爬取正确答案

但是这样要前后暂停两秒

并且在点下一题之后必须暂停,否则无法爬取,会出现错误

时间更长了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值