摘要:
阅读这部分快速回忆下相关知识,文末有例子、
主要的使用步骤:
(1)安装Selenium,下载驱动并添加环境变量,安装katalon recorder
(2)【firefox浏览器】在katalon recorder中点recorder开始记录,然后在export生成python代码
(3)可能出现一些报错,可以试着添加
#1 设置最大等待时长为 10秒
driver.implicitly_wait(10)
#2刷新
driver.refresh()
#3查看是否在frame里而不是html里
#4可能已经切换了窗口,但是还在原来的窗口查找,所以报错。
print(driver.title)
(4)selenium主要难点是如何选择,比如选择页面的某个按钮。当然也有很多工具可以用,
例如,可以用 find_elements_by_class_name
也可用ccs,通过类名或者ID,或者属性。下面有详细介绍。当然我用的是浏览器里的插件,做记录然后导出python程序。
几种选择方式的差别推荐一个博客https://blog.csdn.net/u012941152/article/details/97267338
(5)里面的一些小知识点,例如webdriver和element 之间的差别,一个是全文一个是当前的标签下。
wd = webdriver.Chrome()
wd.get('http://cdn1.python3.vip/files/selenium/sample1.html')
element = wd.find_element_by_id('container')
(6)至于如何切换窗口,如何延时,刷新,可看文末的程序例子。
【1】下载火狐
【2】添加组件 katalon recorder
在火狐里搜katalon recorder就行。
【3】下载驱动,并添加环境变量,我直接下载的最新的。
https://github.com/mozilla/geckodriver/releases
【4】安装Selenium
下载Selenium的官方地址:https://pypi.org/project/selenium/
进入此目录后,输入python setup.py install
pip list 查看是否安装成功
------------------------------------------------------------------------------------------------华丽丽的分割线,后面是笔记-----------------
【5】各种报错,不得不过一遍基础知识。。。
推荐一个网站http://www.python3.vip/tut/auto/selenium/01/ 后面很多例子都用的他里面的
【6】右键----检查可以看到元素的各种属性,比如id class ,可以根据这些东西进行定位。
例如:百度搜索框的id
# 根据id选择元素,返回的就是该元素对应的WebElement对象
element = wd.find_element_by_id('kw')
【7】<>这个称为元素,里面的称为子元素
<div class="plant"><span>土豆</span></div>
<div class="animal"><span>狮子</span></div>
所有的植物元素都有个class属性 值为 plant。
所有的动物元素都有个class属性 值为 animal。
如果我们要选择 所有的 动物, 就可以使用方法 find_elements_by_class_name
elements = wd.find_elements_by_class_name('animal')
【8】根据标签查找,加括号里的<body><span>等等这些
【9】限制搜索的范围方法
WebDriver 对象 选择元素的范围是 整个 web页面, 而
WebElement 对象 选择元素的范围是 该元素的内部。
wd = webdriver.Chrome()
wd.get('http://cdn1.python3.vip/files/selenium/sample1.html')
element = wd.find_element_by_id('container')
# 限制 选择元素的范围是 id 为 container 元素的内部。
spans = element.find_elements_by_tag_name('span')
【10】设置延时
wd.implicitly_wait(10)
【11】获取整个元素对应的HTML
要获取整个元素对应的HTML文本内容,可以使用 element.get_attribute('outerHTML')
如果,只是想获取某个元素 内部
的HTML文本内容,可以使用 element.get_attribute('innerHTML')
【12】ccs
【13】ccs(2)
CSS Selector 同样可以根据tag名、id 属性和 class属性 来 选择元素,
根据 tag名 选择元素的 CSS Selector 语法非常简单,直接写上tag名即可,
【14】ccs 空格和>区别
元素1 > 元素2 > 元素3 > 元素4
就是选择 元素1
里面的子元素 元素2
里面的子元素 元素3
里面的子元素 元素4
, 最终选择的元素是 元素4
如果 元素2
是 元素1
的 后代元素, CSS Selector 选择后代元素的语法是这样的
元素1 元素2
【15】[]
id、class 都是web元素的 ```属性``` ,因为它们是很常用的属性,所以css选择器专门提供了根据 id、class 选择的语法。
那么其他的属性呢?
比如 <a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>
里面根据 href选择,可以用css 选择器吗?
css 选择器支持通过任何属性来选择元素,语法是用一个方括号 []
。
【16】F12
ctrl+f 输入表达式,搜索下可以验证表达式写的对否
【17】. 类名 # id 举例如下:
【18】逗号 表示同时选择
【19】父元素的第n个子节点
我们可以指定选择的元素 是父元素的第几个子节点
,使用 nth-child
选择的是 第2个子元素,并且是span类型
所以这样可以这样写 span:nth-child(2)
【20】倒数第几个子节点
,使用 nth-last-child
【21】
(1)选择的是 第2个子元素,并且是span类型
所以这样可以这样写 span:nth-child(2)
(2)选择父元素的 倒数第几个某类型
的子节点
使用 nth-last-of-type
我们可以指定选择的元素 是父元素的第几个 某类型的
子节点使用 nth-of-type
选择的是 第2个子元素,并且是span类型,所以这样可以这样写 span:nth-child(2)
,
【22】+
h3 后面紧跟着的兄弟节点
span。
这就是一种 相邻兄弟 关系,可以这样写 h3 + span
【23】~
如果要选择是 选择 h3 后面所有的兄弟节点
span,可以这样写 h3 ~ span
【24】frame
(1)转入frame
(2)转出frame
wd.switch_to.default_content()
【25】切换到新的窗口
那么我们就可以通过 类似下面的代码,
for handle in wd.window_handles:
# 先切换到该窗口
wd.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if 'Bing' in wd.title:
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
break
上面代码的用意就是:
我们依次获取 wd.window_handles 里面的所有 句柄 对象, 并且调用 wd.switch_to.window(handle) 方法,切入到每个窗口。
(切换到原来的)
因为我们一开始就在 原来的窗口里面,我们知道 进入新窗口操作完后,还要回来,可以事先 保存该老窗口的 句柄,使用如下方法
# mainWindow变量保存当前窗口的句柄
mainWindow = wd.current_window_handle
切换到新窗口操作完后,就可以直接像下面这样,将driver对应的对象返回到原来的窗口
#通过前面保存的老窗口的句柄,自己切换到老窗口
wd.switch_to.window(mainWindow)
【26】打印当前窗口名字
# wd.title属性是当前窗口的标题栏 文本
print(wd.title)
【27】driver.refresh()
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
# 设置最大等待时长为 10秒
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/baidu?tn=monline_7_dg&ie=utf-8&wd=%E5%93%88%E5%93%88")
print(driver.title)
driver.find_element_by_id("su").click()
print(driver.title)
# for handle in driver.window_handles:
# # 先切换到该窗口
# driver.switch_to.window(handle)
# print(driver.title)
# # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
# if '百科' in driver.title:
# # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
# break
driver.refresh()
#driver.find_element(By.LINK_TEXT,"哈哈_百度百科").click()
driver.find_element_by_link_text(r"哈哈_百度百科").click()
print(driver.title)
【28】完整的程序,以后可以在他基础上改。
程序主要就是click
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() # 设置最大等待时长为 10秒 driver.implicitly_wait(10) driver.get("https://www.baidu.com/baidu?tn=monline_7_dg&ie=utf-8&wd=%E5%93%88%E5%93%88") print(driver.title) print("https://www.baidu.com/baidu?tn=monline_7_dg&ie=utf-8&wd=%E5%93%88%E5%93%88") print("--------------------------") driver.find_element_by_id("su").click() print(driver.title) print("su") print("--------------------------") driver.refresh() driver.find_element_by_link_text(u"哈哈_百度百科").click() for handle in driver.window_handles: # 先切换到该窗口 driver.switch_to.window(handle) print("窗口名字",driver.title) # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口 if '百科' in driver.title: # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环, break driver.refresh() print("哈哈_百度百科") print(driver.title) print("--------------------------") driver.find_element_by_link_text(u"近义词").click() for handle in driver.window_handles: # 先切换到该窗口 driver.switch_to.window(handle) print("窗口名字",driver.title) # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口 if '近义词' in driver.title: # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环, break driver.refresh() print("近义词") print(driver.title) driver.find_element_by_link_text(u"呵呵").click() for handle in driver.window_handles: # 先切换到该窗口 driver.switch_to.window(handle) print("窗口名字",driver.title) # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口 if '呵呵' in driver.title: # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环, break driver.refresh() print(driver.title) print("呵呵") driver.find_element_by_link_text(u"嘲笑").click() for handle in driver.window_handles: # 先切换到该窗口 driver.switch_to.window(handle) print("窗口名字",driver.title) # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口 if '嘲笑' in driver.title: # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环, break driver.refresh() print(driver.title) print("嘲笑")