美文网首页
selenium 基础整理 (一)

selenium 基础整理 (一)

作者: 一如既往而已 | 来源:发表于2019-12-06 16:10 被阅读0次

将自己之前的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 的使用

  1. 使用 browser.find_element_by_xx() 得到的是一个 WebElement 实例
    使用获得的实例调用上面的 API 即可进行层级查找

  2. 使用 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/')

相关文章

网友评论

      本文标题:selenium 基础整理 (一)

      本文链接:https://www.haomeiwen.com/subject/kwregctx.html