Selenium系列(十七) - Web UI 自动化基础实战(4)
如果你还想从头学起Selenium,可以看看这个系列的文章哦!
https://www.cnblogs.com/poloyy/category/1680176.html
其次,如果你不懂前端基础知识,需要自己去补充哦,博主暂时没有总结(虽然我也会,所以我学selenium就不用复习前端了哈哈哈...)
注意,目前的实战都是流水账式写的,后面才会结合框架+PO模式
目的是为了掌握所学的Selenium基础
实战题目
- 登录 http://www.51job.com
- 点击高级搜索
- 输入搜索关键词 python
- 地区选择 杭州
- 职能类别 选 计算机软件 -> 高级软件工程师
- 公司性质 选 上市公司
- 工作年限 选 1-3 年
- 搜索最新发布的职位, 抓取页面信息。 得到如下的格式化信息
Python开发工程师 | 杭州纳帕科技有限公司 | 杭州 | 0.8-1.6万/月 | 04-27
Python高级开发工程师 | 中浙信科技咨询有限公司 | 杭州 | 1-1.5万/月 | 04-27


代码思路(人为测试时的操作步骤)
- 点击【高级搜索】
- 关键字输入python
- 点击城市
- 显式等待,定位所有默认已选中的城市
- 取消选中它们
- 点击【北京】
- 点击【确定】
- 发现关键字输入框下方出现关键字历史记录,需要点击任意地方才能取消显示,所以随便找一个可点击元素进行点击
- 点击【职能类别输入框】
- 显式等待,点击【后端开发】
- 点击【高级软件工程师】
- 点击【确定】
- 点击【工作年限】,选择1-3年
- 点击【公司性质】,选择上市公式
- 点击【搜索】
- 定位职位列表,除了第一行
- 循环职位列表,获取每一行的信息存入列表
- 格式化输出
代码
# !/usr/bin/env python
# -*- coding: utf-8 -*- """
__title__ =
__Time__ = 2020/3/25 17:52
__Author__ = 小菠萝测试笔记
__Blog__ = https://www.cnblogs.com/poloyy/
"""
from time import sleep
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec # 加载驱动
driver = webdriver.Chrome("../resources/chromedriver.exe") def wait_element(driver, by_, element_, timeout=10):
element = WebDriverWait(driver, timeout=timeout).until(
ec.presence_of_element_located(
(by_, element_)
)
)
return element def wait_elements(driver, by_, element_, timeout=10):
element = WebDriverWait(driver, timeout=timeout).until(
ec.presence_of_all_elements_located(
(by_, element_)
)
)
return element # 加载驱动
driver = webdriver.Chrome("../resources/chromedriver.exe") # 打开网站
driver.get("http://www.51job.com")
driver.maximize_window() # 高级搜索
more_btn = wait_element(driver, By.CLASS_NAME, "more").click() # 职位框
wait_element(driver, By.ID, "kwdselectid").send_keys("python") # 城市按钮
driver.find_element_by_id("work_position_click").click() # layer
layer = wait_element(driver, By.ID, "work_position_layer")
# 城市列表
city_list = wait_elements(driver, By.CSS_SELECTOR, "div#work_position_click_center_right_list_000000 table em.on")
for city in city_list:
sleep(1)
city.click() # 杭州
wait_element(driver, By.ID, "work_position_click_center_right_list_category_000000_080200").click() # 确认
wait_element(driver, By.ID, "work_position_click_bottom_save").click() # form
wait_element(driver, By.CSS_SELECTOR, "div#historylist>div.r1").click() # 职能类别
wait_element(driver, By.ID, "funtype_click").click() # 职能弹窗
type_layer = wait_element(driver, By.ID, "funtype_layer") # 后端开发
wait_element(driver, By.ID, "funtype_click_center_right_list_category_0100_0100").click() # f如果有已选列表,取消选择
flag = wait_element(driver, By.ID, "funtype_click_multiple_selected")
if flag.text:
# 已选列表
type_list = wait_elements(driver, By.CSS_SELECTOR, "div#funtype_click_multiple_selected>span")
for types in type_list:
if types.text == "高级软件工程师":
continue
em = types.find_element_by_tag_name("em")
em.click() # 高级软件工程师
wait_element(driver, By.ID, "funtype_click_center_right_list_sub_category_each_0100_0106").click() # 确定
driver.find_element_by_id("funtype_click_bottom_save").click() # 公司性质
company = wait_element(driver, By.ID, "cottype_list")
company.click() # 列表
ctype_list = company.find_elements_by_css_selector("div.ul > span")
for ctype in ctype_list:
# 外资(欧美)没有数据
if ctype.text == "上市公司":
ctype.click()
break # 工作年限
workyear_list = wait_element(driver, By.ID, "workyear_list")
workyear_list.click() # 列表
wlist = workyear_list.find_elements_by_css_selector("div.ul > span")
for wtype in wlist:
if wtype.text == "1-3年":
wtype.click()
break # 搜索按钮
wait_element(driver, By.CSS_SELECTOR, "div.btnbox > span.p_but").click() # 职位列表
resultList = wait_elements(driver, By.CSS_SELECTOR, "div#resultList>div.el")[1:]
for res in resultList:
spans = res.find_elements_by_tag_name("span")
texts = [x.text for x in spans]
# 最终输出
print(" | ".join(texts)) sleep(10)
driver.quit()
Selenium系列(十七) - Web UI 自动化基础实战(4)的更多相关文章
- Selenium系列(十四) - Web UI 自动化基础实战(1)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- Selenium系列(十五) - Web UI 自动化基础实战(2)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- Selenium系列(十六) - Web UI 自动化基础实战(3)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- Selenium系列(十八) - Web UI 自动化基础实战(5)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- Selenium系列(十九) - Web UI 自动化基础实战(6)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- selenium(12)-web UI自动化项目实战(PO模式,代码封装)
web UI自动化项目实战-项目 项目使用禅道,所以你需要搭建1个禅道,搭建禅道的方法和步骤见 https://www.cnblogs.com/xinhua19/p/13151296.html 搭建U ...
- 【Robot Framework 项目实战 02】SeleniumLibrary Web UI 自动化
前言 SeleniumLibrary 是针对 Robot Framework 开发的 Selenium 库.它也 Robot Framework 下面最流程的库之一.主要用于编写 Web UI 自动化 ...
- Python Selenium 搭建Web UI自动化
Python搭建UI自动化环境 下载Python3 Python官网 PyCharm 环境配置 安装Python 勾选Add Python to PATH,一直下一步. 验证:CMD输入Python ...
- Python—UI自动化完整实战
实战项目 均来源于互联网 测试报告2017年11月29日优化后的测试报告:https://github.com/defnngj/HTMLTestRunner 1.项目概述: 本实战已126邮箱为例子进 ...
随机推荐
- 从 HTTP 切换到 HTTPS,这下我的技术博客安全了吧?
博客园 的小伙伴们,大家好,我是刚脱离险境的二哥呀! 很久(大概两年)之前,我就搞了一个独立的个人博客网站,长下面这样. 大家有访问过的,可以在评论区扣 1 可惜一直没搞备案和 HTTPS,导致每次访 ...
- vue中rem的转换
1 function rems(doc: any, win: any): void { 2 let docEl = doc.documentElement, 3 resizeEvt = 'orient ...
- 如何根治慢SQL?
本文摘自:CodeSheep 今天和大家聊一个常见的问题:慢SQL. 包括以下内容: 慢SQL的危害 SQL语句的执行过程 存储引擎和索引的那些事儿 慢SQL解决之道 后续均以MySQL默认存储引擎I ...
- 获取异常信息里再出异常就找不到日志了,我TM人傻了
本系列是 我TM人傻了 系列第三期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 最近组 ...
- [数据结构-平衡树]普通 FHQ_Treap从入门到精通(注释比代码多系列)
普通 FHQ_Treap从入门到精通(注释比代码多系列) 前提说明,作者写注释太累了,文章里的部分讲解来源于Oi-wiki,并根据代码,有部分增改.本文仅仅发布于博客园,其他地方出现本文,均是未经许可 ...
- Rancher v1.6.29 Docker单节点部署
前言: Docker镜像中心,有两个版本的rancher(1.X),镜像名称为:rancher/server,而rancher(2.X)的镜像名称是rancher/rancher 去daocloud官 ...
- CSS 奇思妙想 | 使用 resize 实现强大的图片拖拽切换预览功能
本文将介绍一个非常有意思的功能,使用纯 CSS 利用 resize 实现强大的图片切换预览功能.类似于这样: 思路 首先,要实现这样一个效果如果不要求可以拖拽,其实有非常多的办法. 将两张图片叠加在一 ...
- Golang语言系列-05-数组和切片
数组和切片 数组 概念 数组是同一种数据类型元素的集合:数组的长度必须是常量,并且长度是数组类型的一部分,一旦定义,长度不能变 例如:[5]int 和 [10]int 是不同的数组类型 使用时可以修改 ...
- MATLAB—数组运算及数组化编程
文章目录 前言 一.数组的结构和创建 1.数组及其结构 2.行数组的创建 3.对数组构造的操作 二.数组元素编址及寻访 1.数组元素的编址 2.二维数组元素的寻访 三.数组运算 非数的问题 前言 编程 ...
- PyCharm启动报错 TypeError: unsupported operand type(s) for /: ‘str’ and ‘str’ 解决
这个提示大概是说:"类型错误:不支持操作类型为字符串和字符串",直接把两个字符串(BASE_DIR = os.path.dirname(os.path.dirname(os.pat ...