selenium 是浏览器自动化测试框架,可以控制浏览器,模仿人浏览,操作网页,从而获取数据,自动操作等。
以下3个实践视频 : https://weibo.com/2203755810
1. 百度的应用 :
#1:
selenium登陆百度主页,暂停下一步程序运行,加入sleep(), 目的为了主页完成完整的加载,这里设置为 3。
#2:
如下图1 。
打开 HTML 源代码,发现 "设置”是写在一个 非自闭合的 span label 里,而其它的分级菜单, 嵌套在 一个 div 的块区域 label 里,每个分级菜单,是一个独立的带超链接的 a label , 如下图2
因此在这个分级菜单,如果要定位相关的元素,只能用定位的方法,不可以用 Select 库的方法(下面的 Select 库例子会提到),否则会出现 如下图3 的报错。
先通过 ActionChains 的 move 方法,移到“设置” 所定位的位置选项上,然后再定位“高级搜索”,最后用 ActionChains的 click 方法实现选择“高级搜索”,弹出 如下图4 的对话框,最后设置 sleep(), 随便设置为3。
ActionChians的方法还有好多,具体可以通过官方简书查看说明,或者通过它的库帮助提示去看看,如下图5,具体弹出方法有两种, 一种是 按着 “Ctrl” 然后鼠标移到 库名上,会自动变成一个带手指的超链接,另外一种是,把库名 highlight 后,会弹出帮助提示的超链接,如下图6
#3:
在 “高级搜索里”,先定位 “包含全部关键词”,如下图7,然后 通过 send_keys() 方法,输入所需要搜索的内容。
然后再定位 “全部时间”,如下图8,再通过 click()方法打开下拉的分级菜单。例如要选择 “最近一周”,先定位这一选项的位置。
根据Element 的 显示,每个分选项都是一个独立的 p label, 而且都带有相同的 属性名class 和属性值 c-select-item。 如下图9
同时,也看到 这些的 p label 都是嵌套在 class= c-select-dropdown-list 的 div label 下。如果要定位 “最近一周”, 有两种方法。
(1) 先定位 class= c-select-dropdown-list 的 div label,然后通过循环,用 index 的方法,筛选出 " 最近一周” 的 label
(2) 另外一种,就是通过 CSS 选择器,直接一步定位,如下面代码。
定位了“最近一周”后,通过 click()方法,点击选择后,设置 sleep(), 随便设置为3,暂缓下一步程序。
#4:
定位“ 高级搜索” (也就是 submit ),然后 click() 点击,最后新建新的搜索结果页面,如下图10
注: ActionChians 方法,最后切记要 添加 perform() 方法去执行
图1
图2
图3
图4
图5
图6
图7
图8
图9
图10
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
#1
browser = webdriver.Chrome()
browser.get(‘https://www.baidu.com’)
time.sleep(3)
#2
ActionChains(browser).move_to_element(browser.find_element_by_id(‘s-usersetting-top’)).perform()
ActionChains(browser).click(browser.find_element_by_link_text(‘高级搜索’)).perform()
time.sleep(3)
#3
adv_input = browser.find_element_by_id(‘adv_keyword’)
adv_input.send_keys(‘testing’)
time_zone = browser.find_element_by_class_name(‘c-select-selected-value’)
time_zone.click()
time.sleep(3)
last_week = browser.find_element_by_css_selector(’#adv-setting-gpc > div > div.c-select-dropdown > div.c-select-dropdown-list > p:nth-child(3)’)
last_week.click()
time.sleep(3)
#4
adv_search = browser.find_element_by_class_name(‘advanced-search-btn’)
adv_search.click()
2.新浪的应用 :
#1:
selenium登陆新浪首页,同样加入 sleep() 让网页有足够的时间去加载完整。
#2:
网页上,分别有 “图片”,“专栏”,“热点” 3个板块
其中如果用鼠标点去 “图片”和 “专栏”位置,会有另外一个页面弹出, 但点去“热点" 却没有。因为根据Element结构,“图片”,“专栏"都有相关的 href 超链接的 a label ,热点却只有 span label, 所以点去”热点”,没有发生自动跳转去另外一个页面, 如下图1
直接用 CSS 选择器,给“ 热点”定位,然后用 ActioanChians 的 move() 方法,移动定位的位置。
#3:
例如选择“热点”下的第2张图片,直接用CSS 选择器先把这图片定位, 如下图2, 最后用 ActionChains 的 click() 方法实现打开图片的超链接。
图1
图2
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
#1
browser = webdriver.Chrome()
browser.get(‘https://www.sina.com.cn’)
time.sleep(3)
#2
ActionChains(browser).move_to_element(browser.find_element_by_css_selector(‘body > div.main > div.part-a.clearfix > div.part-a-m > div.mod-04.uni-blk > div.uni-blk-t.clearfix > div > div > span:nth-child(3)’)).perform()
#3
ActionChains(browser).click(browser.find_element_by_css_selector(’#fc_B_hot > div > a:nth-child(2)’)).perform()
注: ActionChians 方法,最后切记要 添加 perform() 方法去执行
3. Select库,下拉分级菜单鼠标悬浮应用
#1:
登陆相关主页,以 http://www.edu0574.com/nbuckcj.asp为例,加入 sleep() 让网页有足够的时间去加载完整。
#2:
“考试年月” 有一个下拉的分级菜单项,首先对它定位。
根据 Element 结构,看到 它是一个 select label, 每个分选项都是一个独立的 option label, 而且带有 value 属性值,都是嵌套在 select label里, 如下图1
#3:
最后用 Select库的 select_by_value()方法,去选择所需要的项,例如 2019 。
Select 库里,还有其它的方法,例如 by_index() by_visible_text 等等,具体查找方法,如上面 ActionChains 库查找方法一样。
Select库适用于大多数有下拉的分级菜单,但具体要看 Element 结构,不一定所有都可以的,以 新浪为例
在新浪的首页,有一个“新闻”的 下拉菜单,在 Element 结构里,这个element 同样是 建立在一个 select label, 分级菜单的每一个选项,也是一个独立的 option label, 而且有 value 属性值,但由于在 select label 里,有一个非可视设置,style=“display: none;” ,导致如果用 Select 库时,会出现报错 : element not interactable : Element is not currently visible and may not be manipulated, 大概意思就是 selenium 检测到所定位的 element 设置了非可视属性, 如下图3
图1
图2
图3
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
#1:
browser = webdriver.Chrome()
browser.get(‘http://www.edu0574.com/nbuckcj.asp’)
time.sleep(2)
#2:
option = browser.find_element_by_name(‘kspc’)
#3:
Select(option).select_by_value(‘2019’)