爬虫学习笔记----day3

主线参考来源:https://www.cnblogs.com/yoyoketang/tag/selenium/default.html?page=1
1.定位方法
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
(element形式相同)( t2 = driver.find_element(“name”, "tj_trnews"该形式也可)
补充:关于Fiddler:http://www.hangge.com/blog/cache/detail_1697.html
2.unittest
参考:https://blog.csdn.net/huilan_same/article/details/52944782
核心:定义类class Blog(unittest.TestCase)
1.测试用例的名称要以test开头;
2.每一个用例执行的结果的标识,成功是 .,失败是 F,出错是 E,跳过是 S
3.在unittest.main()中加 verbosity 参数可以控制输出的错误报告的详细程度,默认是 1,如果设为 0,则不输出每一用例的执行结果,即没有上面的结果中的第1行;如果设为 2,则输出详细的执行结果;
4.前置和后置(如果没有也可以写pass)
1.setUp:在写测试用例的时候,每次操作其实都是基于打开浏览器输入对应网址这些操作,这个就是执行用例的前置条件。
2.tearDown:执行完用例后,为了不影响下一次用例的执行,一般有个数据还原的过程,这就是执行用例的后置条件。
5.TestSuite(控制用例执行的程序)
6.批量执行
1.新建Pure Python
2.选中刚才新建的工程右键>New>Python Package>新建一个case文件夹
3.重复第2步的操作,新建一个case的文件夹,放入用例脚本
4.打开脚本,写入用例
5.项目下面创建一个脚本run_all_case.py,接下来用这个脚本去批量执行所有的用例。里面可以用以下方法:discover

  • 1.discover方法里面有三个参数:
    -case_dir:这个是待执行用例的目录。
    -pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。
    -top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。
    2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就 可以用unittest里面的TextTestRunner这里类的run方法去执行。

    discover=unittest.defaultTestLoader.discover(case_path,pattern=’‘test*.py’’,top_level_dir=None)
    if name == “main”:
    runner = unittest.TextTestRunner()
    runner.run(all_case())
    #html报告
    report_abspath = os.path.join(report_path, “result.html”)
    fp = open(report_abspath, “wb”)
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
    title=u’自动化测试报告,测试结果如下:’,
    description=u’用例执行情况:’)
    #调用add_case函数返回值
    runner.run(all_case())
    fp.close()
    7.装饰器
    把打开浏览器操作放到前置setUpClass(cls)里,这样就可以实现打开一次浏览器,执行多个case了。tearDownClass(cls)同理。def前加@classmethod
    8.断言

  1. 1.assertEqual(self, first, second, msg=None)
    2.assertNotEqual(self, first, second, msg=None)
    3.assertIn(self, member, container, msg=None)
    4.assertNotIn(self, member, container, msg=None)
    5.assertTrue(self, expr, msg=None)
    –判断是否为真:expr is True
    6.assertFalse(self, expr, msg=None)
    7.assertIsNone(self, obj, msg=None)
    –判断是否为None:obj is None
    8.assertIsNotNone(self, obj, msg=None)
    9.数据驱动(ddt)
    对多组数据的测试用例,来进行用例自动加载生成
    1.测试数据为多个字典的list类型
    2.测试类前加修饰@ddt.ddt
    3.case前加修饰@ddt.data()
    10.htmlhttps://www.cnblogs.com/yoyoketang/p/7744538.html
    3.捕获异常
    1.为了让程序继续执行,我们可以用try…except…捕获异常。捕获异常后可以打印出异常原因,这样以便于分析异常原因。例:
    try:
    element = driver.find_element(“id”, “blog_nav_newpostxx”)
    except NoSuchElementException as msg:
    print u"查找元素异常%s"%msg
    常见异常:
  • 1.NoSuchElementException:没有找到元素
    2.NoSuchFrameException:没有找到iframe
    3.NoSuchWindowException:没找到窗口句柄handle
    4.NoSuchAttributeException:属性错误
    5.NoAlertPresentException:没找到alert弹出
    6.lementNotVisibleException:元素不可见
    7.ElementNotSelectableException:元素没有被选中
    8.TimeoutException:查找元素超时
    4.文件下载
    SendKeys.SendKeys("{ENTER}")#要先切换到再回车操作
    5.截图
    get_screenshot_as_file(self, filename)#获取当前窗口的截图
    get_screenshot_as_base64(self)#保存成base64编码的格式
    6.模拟触摸
    from selenium import webdriver
    from selenium.webdriver.common.touch_actions import TouchActions
    from selenium.webdriver.chrome.options import Options
    url = “https://login.m.taobao.com/msg_login.htm?spm=0.0.0.0
    #设置成手机模式
    mobile_emulation = {“deviceName”:“iPhone 6”}
    options = Options()
    options.add_experimental_option(“mobileEmulation”, mobile_emulation)
    driver = webdriver.Chrome(chrome_options=options)
    driver.get(url)
    driver.find_element_by_id(“username”).send_keys(“yoyoketang”)
    #触摸事件
    el = driver.find_element_by_id(‘getCheckcode’)
    TouchActions(driver).tap(el).perform()
    7.启动配置
    #打开浏览器之前加入
    option = webdriver.ChromeOptions()
    option.add_argument(‘disable-infobars’)
    8.静默模式
    #在打开浏览器前加入
    option = webdriver.ChromeOptions()
    option.add_argument(‘headless’)
    9.BeautifulSoup查找类并发送错误
    beautifulsoup用法:https://www.cnblogs.com/yoyoketang/tag/beautifulsoup4/
    from bs4 import BeautifulSoup
    import sys
    reload(sys)
    sys.setdefaultencoding(‘utf8’)

def is_result_pass():
try:
with open(“result.html”, “r”) as fp:
f = fp.read() # 读报告
soup = BeautifulSoup(f, “html.parser”)
status = soup.find_all(class_=“attribute”)
result = status[2].contents[-1] # 获取报告结果
if “Failure” in result or “Error” in result:
print(“测试过程有不通过用例:%s”%result)
return False
else:
return True
except Exception as msg:
print(“判断过程出现异常:%s”%str(msg))
return False
if name == “main”:
print(“qq交流群:226296743”)
res = is_result_pass()
print(res)
10.BeautifulSoup
例:打印所有时间
r = requests.get(“http://www.cnblogs.com/yoyoketang/”)
#请求首页后获取整个html界面
blog = r.content
#用html.parser解析html
soup = BeautifulSoup(blog, “html.parser”)
获取所有的class属性为dayTitle,返回Tag类
times = soup.find_all(class_=“dayTitle”)
for i in times:
print i.a.string # 获取a标签的文本
1.prettify()这个方法是把文件解析成html格式,用html的标准格式输出(有缩进的)
2.BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
Tag : 标签对象,如:

yoyoketang

,这就是一个标签
NavigableString :字符对象,如:这里是我的微信公众号:yoyoketang
BeautifulSoup :就是整个html对象
Comment :注释对象,如:!-- for HTML5 --,它其实就是一个特殊NavigableString
3.Tag
  1. 1.tag的name属性,每一个tag都有name属性,用.name获取,如上面的三个name属性分别为p,b,head。也就是<xx开头的,这里的xx就是它的name属性(html是一个树状结构的,每个tag都有属性,整个html对象也有name属性,它的属性是:[document])
    2.tag对象contents可以获取所有的子节点,返回的是list;获取所有的子孙节点就可以用.descendants方法
    11.多线程
    多线程设计思路:
    先写一个run的函数
    保证for循环能跑的通
    在run函数上加个装饰器 @threads(n),n是线程数
    12. paramunittest
    @paramunittest.parametrized

猜你喜欢

转载自blog.csdn.net/weixin_43330757/article/details/98844412