将自己之前的selenium学习记录的自抽空理整下分享给大家,也是对自己这么长时间来使用的总结吧。
一、元素的定位操作
以下是所有定位操作的 API :
返回一个匹配元素, 即一个 WebElement 元素
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
返回一个列表, 包含所有匹配的元素, 即一个 WebElement 列表
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
常用定位元素使用例子
#通过id方式定位
browser.find_element_by_id("kw").send_keys("selenium")
#通过name方式定位
browser.find_element_by_name("wd").send_keys("selenium")
#通过tag name方式定位(失败的去掉)
browser.find_element_by_tag_name("input").send_keys("selenium")
#通过class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
#通过CSS方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium")
#通过xphan方式定位
browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
############################################
browser.find_element_by_id("su").click()
'''
#CSS的比较灵活可以选择控件的任意属性,上面的例子中:
find_element_by_css_selector("#kw")
#通过find_element_by_css_selector( )函数,选择取百度输入框的id属性来定义,也可以取name属性
<a href="http://news.baidu.com" name="tj_news">新 闻</a>
driver.find_element_by_css_selector("a[name=\"tj_news\"]").click()
'''
使用的时候需注意下面几点 :
1). python selenium 提供了两种对象 : WebDriver 和 WebElement
这两种对象都可以使用这些 API
2). 这些 API 一旦执行失败(即查找不到), 就会抛出异常
因此必须使用 try: .. except: ... 机制避免错误的行为影响程序继续进行
3). WebDriver 调用以上 API 进行全局定位
WebElement 调用以上 API 可以进行层级定位, 即 查找当前元素的子元素
二、WebDriver 和WebElement的使用
2.1 WebDriver 的使用
开始的时候必须要有初始化一个 WebDriver 实例, 即下面的 browser 用来对浏览器进行控制以及页面的访问
#请求连接
req_url = "http://www.haosou.com/s?ie=utf-8&shb=1&src=360sou_newhome&q=%E9%B2%9C%E8%8A%B1"
# 打开浏览器
browser = webdriver.Chrome()
#开始请求
browser.get(req_url)
接着, 就可以使用异常 API 进行当前页面的全局查找, 比如 :
#获取所有的广告
all_ads_li = browser.find_elements_by_css_selector('#e_idea_pp li')
2.2 WebElement 的使用
-
使用 browser.find_element_by_xx() 得到的是一个 WebElement 实例
使用获得的实例调用上面的 API 即可进行层级查找 -
使用 browser.find_elements_by_xx() 得到的是一个元素是 WebElement 实例的 list
通过对 list 的遍历, 即可对各个实例进行相应的操作
三、webdriver和webelement的常用操作函数
3.1 WebDriver 的一些常用操作
3.1.1 WebDriver常用的函数
browser.get(url) : 在当前窗口加载 url
browser.refresh() : 刷新当前页面
browser.close() : 关闭当前窗口, 如果当前窗口是最后一个窗口, 浏览器将关
browser.quit() : 关闭所有窗口并停止 ChromeDriver 的执行
browser.back() : 相当于浏览器的后退历史记录
browser.forward() : 相当于浏览器的前进历史记录
3.1.2 WebDriver 常用的属性
browser.page_source : 当前页面的源码 (一般可以用beautifulSoup解析)
browser.title : 当前页面的 title
browser.name : 当前浏览器的名字
browser.curren_url : 获取当前加载页面的 URL
3.1.3 WebDriver 其他属性(js/cookies/window)
JS脚本:
browser.execute_script(script, *args) : 同步执行 js 脚本
browser.execute_async_script(script, *args) : 异步执行 js 脚本
Cookies:
browser.add_cookie(cookie_dict) : 为当前会话添加 cookie
browser.get_cookie(name) : 得到执行 cookie
browser.get_cookies() : 得到所有的 cookie
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’})
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’})
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})
browser.delete_all_cookies() : 删除当前会话的所有cookie
browser.delete_cookie(name) : 删除指定 cookie
Window:
browser.current_window_handle : 当前窗口的 handle, 相当于一个指针一样的东西,用来指向当前窗口
browser.window_handles : 当前浏览器中的已经打开的所有窗口, 是一个 list
切换 window_handle 指向的窗口
old: browser.switch_to_window(window_handle)
new: browser.switch_to.window(window_handle)
browser.maximize_window() # 窗口最大化
browser.minimize_window() # 窗口最小化
列子:同一个浏览器打开两个标签窗口后进行切换
web_url = "http://www.baidu.com"
browser = webdriver.Chrome()
browser.get(web_url)
window_one = browser.current_window_handle
print(window_one)
#新开一个窗口,通过执行js来新开一个窗口
js='window.open("https://www.sogou.com");'
browser.execute_script(js)
window_two = browser.current_window_handle
print(window_two)
browser.switch_to_window(window_one) # 切换到第一个窗口(废弃)
browser.switch_to.window(window_one)# 切换到第一个窗口(新方式)
Frame:
# 切换frame
old: browser.switch_to_frame()
new: browser.switch_to.frame()
browser.switch_to_default_content() #跳回最外层iframe
智能等待: 详细参考 5.2
implicitly_wait()
3.2 WebElement 的一些常用操作
3.2.1 操作对象函数:
WebElement.click() 点击对象
WebElement.send_keys(text) 在对象上模拟按键输入
WebElement.clear() 清除对象的内容,如果可以的话
WebElement.submit() 提交表单
WebElement.get_attribute() 获得属性值
WebElement.is_displayed() 当前元素是否可见
WebElement.is_enabled() 当前元素是否禁止, 比如经常会禁用一些元素的点击
WebElement.is_selected() : 当前元素是否选中, 文本输入框的内容
3.2.2 操作对象的属性:
WebElement.text 获取该元素的文本
WebElement.tagname 获取该元素的标签名
WebElement.location 获取该元素的位置
3.1.3.使用selenium webdriver 调用js
调用js方法
execute_script(script, *args)
四、针对特殊元素的操作
4.1 选择按钮
方法一:通过查找方式
element = browser.find_element_by_id("nr")
element.find_element_by_xpath("//option[@value='50']").click()
方法二:通过实例化select
from selenium.webdriver.support.ui import Select
option = Select(browser.find_element_by_name("NR"))
option.select_by_index(1) # 从0开始计算,就是选择了第二个选择项
option.select_by_value("50")
option.select_by_visible_text("每页显示50条")
4.2 selenium 对下拉框信息的定位,以及对警告提示框的处理
- 处理下拉框
- switch_to_alert()
- accept()
下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项。
1)常用下拉列表框选择
<html>
<body>
<select id="changeMethod" name="changeMethod">
<option value="aa">AA</option>
<option value="bb">BB</option>
<option value="cc" selected="">CC</option>
</select>
</body>
</html>
将上面的代码保存成html通过浏览器打开会看到一个最简单常见的下拉框,下拉列表有几个选项。
现在我们来选择下拉列表里的BB
m=driver.find_element_by_id("ShippingMethod")
m.find_element_by_xpath("//option[@value='bb']").click()
2)百度搜索设置下拉框操作
#-*-coding=utf-8
from selenium import webdriver
import os,time
driver= webdriver.Firefox()
driver.get("http://www.baidu.com")
#进入搜索设置页
driver.find_element_by_link_text("搜索设置").click()
#设置每页搜索结果为100条
m=driver.find_element_by_name("NR")
m.find_element_by_xpath("//option[@value='100']").click()
time.sleep(2)
#保存设置的信息
driver.find_element_by_xpath("//input[@value='保存设置']").click()
time.sleep(2)
driver.switch_to_alert().accept()
#跳转到百度首页后,进行搜索表(一页应该显示100条结果)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
解析:
当我们在保存百度的设置时会会弹出一个确定按钮;我们并没按照常规的方法去定位弹窗上的“确定”按钮,而是使用:
driver.switch_to_alert().accept()
完成了操作,这是因为弹窗比较是一个具有唯一性的警告信息,所以可以用这种简便的方法处理。
– switch_to_alert()
焦点集中到页面上的一个警告(提示)
– accept()
接受警告提示
五、其他操作
5.1 鼠标操作
这个需要使用webdriver下的ActionChains类,这个类是操作鼠标操作的:
from selenium.webdriver import ActionChains
鼠标操作可分为三类:鼠标移动、鼠标拖拽、鼠标点击
element = driver.find_element_by_name('tj_settingicon') #鼠标点击
ActionChains(driver).click(element).perform() #单击某元素
ActionChains(driver).click_and_hold(element).perform() #在此元素上按下左键不放
ActionChains(driver).context_click(element).perform() #在此元素上单击右键
ActionChains(driver).double_click(element).perform() #在此元素上双击 #鼠标拖拽
ActionChains(driver).drag_and_drop(source,target).perform() #从一个元素的位置,拖至另一个元素位置松开
ActionChains(driver).drag_and_drop_by_offset(source,xoffset,yoffset) #以坐标的形式拖拽,x,y #鼠标移动 ActionChains(driver).move_by_offset(x,y) #移动到(x,y)坐标位置
ActionChains(driver).move_to_element(element) #鼠标移动到某个元素上
ActionChains(driver).move_to_element_with_offset(element,x,y) #移动到某个元素上,然后,在移动到相对坐标(x,y)上
说明:每个方法后都跟了一个perform()很奇怪是不是,这个perform相当于submit提交。如果你的方法后边不写这个,举个例子,百度一下,你就知道ActionChains(driver).click(element) 没有preform()。如果后边没有跟这个,你可以看到,鼠标是点击了,但是没有进行搜索,所以perform相当于提交
5.2 显示等待(WebDriverWait)和隐示等待(implicitly_wait())
由于有些页面加载完后,某些元素还没有加载,这样就会导致异常,脚本稳定性变差
为了解决这个问题,selenium提供了WebDriverWait以及implicitly_wait()等待
1) WebDriverWait显示等待:
expected_conditions类,提供预期条件判断:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ex
WebDriverWait(driver,5,0.5).until(ex.presence_of_element_located(driver.find_element_by_id('kw')))
'''
WebDriverWait(driver,timeout,poll_frequency)在单位时间内,检测元素是否存在。返回bool型
:parameter
driver 驱动
timeout等待时间
poll_frequency检测时间间隔
-------------------------------------------------------------------
一般WebDriverWait配合until和until_not使用
在单位时间内,until直到返回True,until_not相返
WebDriverWait(driver,timeout,poll_frequency).unitl(ex.presence_of_element_located((driver.find_element_by_id('kw')))
需要使用到的包:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ex
from selenium.webdriver.common.by import By
-------------------------------------
presence_of_element_located是判断元素是否存在
ex下还有很多的方法供使用,例如,判断复选是否是勾选等
*****************************************************************
使用时需要注意事项:ex.presence_of_element_located(driver.find_element_by_id('kw'))
这个方法,要有两个括号,因为参数只能是一个元组
'''
expected_conditions类:
ex.element_located_selection_state_to_be((By.ID,"kw")) #元素的选中状态是否符合预期
ex.element_selection_state_to_be(element) #与上一个用法相同,区别在于一个参数是定位,一个是定位后的元素
ex.alert_is_present() #判断页面上,是否存在Alert弹出框
ex.element_located_to_be_selected((By.ID,"kw")) #某个预期元素是否被选中
ex.element_to_be_selected(element) #与上一个用法相同,区别在于一个参数是定位,一个是定位后的元素
ex.element_to_be_clickable() #判断元素是否可见并且可以点击
ex.frame_to_be_available_and_switch_to_it() #判断该表单是否,可以切换进去,可以返回True,并且Switch进去,否则返回False
ex.invisibility_of_element_located() #判断某元素是否存在于Dom树或不可见
ex.new_window_is_opened() #是否有窗口被打开
ex.presence_of_all_elements_located()
ex.presence_of_element_located() #判读元素是否存在
ex.text_to_be_present_in_element() #判读元素中的Text是否包含了预期字符串
ex.text_to_be_present_in_element_value#判断元素的Value是否包含了预期字符串
ex.title_contains(title) #判读当前页面,标题是否包含预期字符串
ex.title_is(title) #判读当前页面,标题是否为预期
ex.visibility_of_all_elements_located()
ex.visibility_of_element_located((By.ID,"kw")) #判断某元素是否可见
ex.visibility_of(element) #与上个用法相同,区别在于参数是定位后的元素,上一个是传的定位
ex.visibility_of_any_elements_located((By.CLASS_NAME,"a#")) #判断是否至少有一个元素在页面中可见,如果定位到就返回列表
is_displayed()元素定位下有这个方法,也可以判断元素是否可见
driver.find_element_by_id('kw').is_displayed()
5.2.2 隐式等待:implicitly_wait()
implicitly_wait(s)参数为秒
通过一段时间的等待,等待页面加载完成
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.baidu.com/')
网友评论