任务1:Selenium基本操作

  

from selenium import webdriver
# 通用选择
from selenium.webdriver.common.by import By
# 动作
from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys
# 抛出异常
from selenium.webdriver.support import expected_conditions as EC
# 异常处理 超时和为发现元素
from selenium.common.exceptions import TimeoutException,NoSuchElementException
from selenium.webdriver.support.wait import WebDriverWait
import time # 申明驱动浏览器对象,支持Android,BlackBerry等手机端浏览器
browser = webdriver.Chrome()
# browser = webdriver.PhantomJS # 设置浏览器窗口大小
browser.set_window_size(1400, 900) try:
# 必须输入完整URL,直接输入www.baidu.com不行
# 打开URL为XXX的网页
browser.get('http://www.baidu.com')
# 开启新选项卡(开启新窗口)
browser.execute_script('window.open()')
# 打印当前所有句柄
print(browser.window_handles)
# 切换句柄(选项卡)
browser.switch_to.window(browser.window_handles[1])
# switch_to_window被switch_to.window代替,用法一致
# browser.switch_to_window(browser.window_handles[1])
# 在新的选项卡中打开XXX网页
browser.get('https://www.taobao.com/')
# 切回第一个选项卡
browser.switch_to.window(browser.window_handles[0])
# 直接通过id查找
input1 = browser.find_element_by_id('kw')
# 通过css选择器查找,直接在检查中Cope→Cope selector
input2 = browser.find_element_by_css_selector('#kw')
# 通过Xpath选择器查找,可以直接在Cope→Cope xpath
input3 = browser.find_element_by_xpath('//*[@id="kw"]') # 通用选择,需要先引入By from selenium.webdriver.common.by import By
# By后面可以跟ID,CSS_SELECTOR,XPATH等,第二个参数就上面括号内的参数
input4 = browser.find_element(By.ID, 'kw') # 多个节点也是按照上面进行查找,只是element后面加个s,find_elements
time.sleep(1)
# 输入框键入'xx'
input1.send_keys('美女')
# 清空文字
# input1.clear()
# 直接敲击键盘Enter键
# input.send_keys(Keys.ENTER)
# 通过找到id为su的搜索键,鼠标单击
browser.find_element_by_id('su').click() time.sleep(1)
browser.execute_script('window.open()')
browser.switch_to.window(browser.window_handles[2])
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
# 切换到子Frame 通常节点名字叫iframe
browser.switch_to.frame('iframeResult')
# 切换回父Frame
# browser.switch_to.parent_frame()
# 找到2个标签
source = browser.find_element(By.CSS_SELECTOR, '#draggable')
target = browser.find_element(By.CSS_SELECTOR, '#droppable')
# 动作链必须先引入 from selenium.webdriver import ActionChains
action = ActionChains(browser)
# 执行拖拽动作
# action.drag_and_drop(source, target)
# 有action 必须有perform方法
action.perform() browser.execute_script('window.open()')
browser.switch_to.window(browser.window_handles[3])
browser.get('https://www.taobao.com/')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
logo = browser.find_element(By.CSS_SELECTOR,'#q')
print(logo)
# 获取输入框属性值
print(logo.get_attribute('aria-label'))
# 获取搜索按钮的文字
input5 = browser.find_element(By.XPATH,'//*[@id="J_TSearchForm"]/div[1]/button')
# 文字
print(input5.text)
# 标签名
print(input5.tag_name)
# id
print(input5.id)
# 在页面中的相对位置
print(input5.location)
# 节点大小
print(input5.size) # 显式等待(等待直到标签出现或超过最大等待时间)
# 设置最大等待时间是10秒
# 报错先引入 from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(browser,10)
# 等待直到id为q的标签出现
input6 = wait.until(EC.presence_of_element_located((By.ID,'q')))
# 等待直到按钮可以被点击
input7 = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search'))) browser.switch_to.window(browser.window_handles[0])
# 前进和后退
browser.back()
time.sleep(3)
browser.forward() # 增加一个cookie
browser.add_cookie({'name':'xiaohei','age':'123'})
# 删除 cookie
# browser.delete_cookie()
# browser.delete_all_cookies() # 当前URL
print(browser.current_url)
# Cookie
print(browser.get_cookies())
# 源代码
# print(browser.page_source)
except NoSuchElementException:
print("No Element") # 一定会做的事情
finally:
# 关闭浏览器
pass
# browser.close()

任务2:unittest测试框架(斗鱼的例子)

'''
Ajax含有很多加密参数,我们无法直接进行爬取,只能借助Selenium
'''
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import unittest
from selenium import webdriver
from bs4 import BeautifulSoup as bs
import time class douyu(unittest.TestCase):
# 初始化方法,必须是setUp()
def setUp(self):
# self.driver = webdriver.Chrome()
self.driver = webdriver.PhantomJS()
self.num = 0
self.count = 0 # 测试方法必须有test字样开头
def testDouyu(self):
self.driver.get("https://www.douyu.com/directory/all") while True:
soup = bs(self.driver.page_source, "lxml")
# 房间名, 返回列表
names = soup.find_all("h3", {"class": "DyListCover-intro"})
# 直播间热度, 返回列表
numbers = soup.find_all("span", {"class": "DyListCover-hot"}) for name, number in zip(names, numbers):
self.num += 1
print(
u"直播间热度: -" + number.get_text().strip() + u"-\t房间名: " + name.get_text().strip() + u'-\t直播数量' + str(
self.num))
result = u"直播间热度: -" + number.get_text().strip() + u"-\t房间名: " + name.get_text().strip() + u'-\t直播数量' + str(
self.num)
with open('123.txt','a',encoding='utf-8') as f:
f.write(result) # self.count += int(number.get_text().strip()) # 如果在页面源码里找到"下一页"为隐藏的标签,就退出循环
if self.driver.page_source.find("dy-Pagination-disabled dy-Pagination-next") != -1:
break # 一直点击下一页
self.driver.find_element_by_class_name("dy-Pagination-next").click()
time.sleep(1) # 测试结束执行的方法
def tearDown(self):
# 退出PhantomJS()浏览器
print("当前网站直播人数" + str(self.num))
print("当前网站总热度" + str(self.count))
self.driver.quit() if __name__ == "__main__":
# 启动测试模块
unittest.main()

  

<day002>Selenium基本操作+unittest测试框架的更多相关文章

  1. Selenium之unittest测试框架详谈及实操

    申明:本文是基于python3.x及selenium3.x. unittest,也可以称为PyUnit,可以用来创建全面的测试套件,可以用于单元自动化测试(模块).功能自动化测试(UI)等等. 官方文 ...

  2. Python 下的unittest测试框架

    unittest测试框架,直接上图吧: data:数据:主要格式为CSV:读取方式:csv.reade: public:封装的模块:通用的模块单独封装,所需参数设置为变量: testcase:测试用例 ...

  3. Selenium关键字驱动测试框架Demo(Java版)

    Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html

  4. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  5. Python接口测试实战3(下)- unittest测试框架

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  6. Selenium WebDriver 数据驱动测试框架

    Selenium WebDriver 数据驱动测试框架,以QQ邮箱添加联系人为示例,测试框架结构如下图,详细内容请阅读吴晓华编著<Selenium WebDiver 实战宝典>: Obje ...

  7. 基于Python的接口自动化-unittest测试框架和ddt数据驱动

    引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...

  8. Selenium系列之--测试框架断言【转】

    selenium提供了三种模式的断言:assert .verify.waitfor 1)Assert(断言) 失败时,该测试将终止. 2)Verify(验证) 失败时,该测试将继续执行,并将错误记入日 ...

  9. unittest测试框架详解

    单元测试的定义 1. 什么是单元测试? ​ 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类,一般是开发来做的,按照测试 ...

随机推荐

  1. php上传(三)

    关于一些上传插件的运用 JQuery上传插件Uploadify使用详解 http://www.cnblogs.com/oec2003/archive/2010/01/06/1640027.html

  2. thinkphp 动态配置

    之前的方式都是通过预先定义配置文件的方式,而在具体的操作方法里面,我们仍然可以对某些参数进行动态配置(或者增加新的配置),主要是指那些还没有被使用的参数. 设置新的值: C('参数名称','新的参数值 ...

  3. 「题解」:Kill

    问题 A: Kill 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 80%算法 赛时并没有想到正解,而是选择了另一种正确性较对的贪心验证. 对于每一个怪,我们定义它的 ...

  4. flutter SnackBar

    无法弹出 snackbar时

  5. Hadoop国内主要发行版本

    Hadoop主要版本 目前国内使用的不收费的Hadoop版本主要包括以下3个: Apache hadoop Cloudera的CDH Hortonworks版本(Hortonworks Data Pl ...

  6. JVM内核-原理、诊断与优化学习笔记(八):JAVA堆分析

    文章目录 内存溢出(OOM)的原因 在JVM中,有哪些内存区间? 堆溢出 永久区 Java栈溢出 直接内存溢出 小问题? MAT使用基础 柱状图显示 支配树 显示线程信息 显示堆总体信息,比如消耗最大 ...

  7. StringUtils里的isEmpty方法和isBlank方法的区别

    原文地址:https://blog.csdn.net/a1102325298/article/details/80410740 isEmpty public static boolean isEmpt ...

  8. 《转》python 10 集合

    自 http://www.cnblogs.com/BeginMan/p/3160565.html 一.目录 1.集合概述 2.关于集合的操作符.关系符号 3.集合的一系列操作(添加.更新.访问.删除) ...

  9. uoj74 【UR #6】破解密码

    题目 发现这个题的本质就是在做\(\rm hash\) 我们显然能够列出\(n\)个方程,之后高消,这是\(O(n^3)\)的 但是观察一下第一个和第二个方程 \[a_{1}26^{n-1}+a_{2 ...

  10. 2018湘潭大学程序设计竞赛【D】

    题目链接:https://www.nowcoder.com/acm/contest/105/D 题意:就是数的fib表示方法.按权展开,又按二进制算出结果输出. 题解:贪心和数论吧.找到跟数最接近的f ...