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

python中鼠标悬浮能显示坐标 python 悬浮窗_python




图2

python中鼠标悬浮能显示坐标 python 悬浮窗_搜索_02


图3

python中鼠标悬浮能显示坐标 python 悬浮窗_超链接_03


图4

python中鼠标悬浮能显示坐标 python 悬浮窗_selenium_04


图5

python中鼠标悬浮能显示坐标 python 悬浮窗_python中鼠标悬浮能显示坐标_05


图6

python中鼠标悬浮能显示坐标 python 悬浮窗_selenium_06


图7

python中鼠标悬浮能显示坐标 python 悬浮窗_搜索_07


图8

python中鼠标悬浮能显示坐标 python 悬浮窗_超链接_08


图9

python中鼠标悬浮能显示坐标 python 悬浮窗_超链接_09


图10

python中鼠标悬浮能显示坐标 python 悬浮窗_超链接_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

python中鼠标悬浮能显示坐标 python 悬浮窗_python中鼠标悬浮能显示坐标_11


图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

python中鼠标悬浮能显示坐标 python 悬浮窗_python中鼠标悬浮能显示坐标_12


图2


图3

python中鼠标悬浮能显示坐标 python 悬浮窗_selenium_13

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’)