selenium 学习(二)

selenium 学习(二)

切换Frame

我们知道网页中有一种节点叫作iframe,也就是子Frame,相当于页面的子页面,它的结构和外部网页的结构完全一致。
Seleniun打开页面后,它默认是在父级 Frame里面操作,而此时如果页面中还有子Frame,它是不能获取到子 Frame里面的节点的。
这时就需要使用 switch_to.frame()方法来切换Frame
示例如下

import time 
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException,TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()

browser.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
# 切换到 iframeResult子页面
browser.switch_to.frame('iframeResult')
try:
    # 在子页面中寻找logo节点,因为logo节点在主页面中,所以结果是找不到的
    logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print("NO LOGO")
# 切换回主页面
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

延时等待

‘’‘在 Selenium中,get()方法会在网页框架加载结束后结束执行,此时如果获取page_source,可能
并不是浏览器完全加载完成的页面,如果某些页面有额外的Ajax请求,我们在网页源代码中也不一
定能成功获取到。所以,这里需要延时等待一定时间,确保节点已经加载出来。
这里等待的方式有两种:一种是隐式等待,一种是显式等待’’’

隐式等待

当使用隐式等待执行测试的时候,如果 Selenium没有在DOM中找到节点,将继续等待,超出设
定时间后,则抛出找不到节点的异常。换句话说,当查找节点而节点并没有立即出现的时候,隐式等
待将等待一段时间再查找DOM,默认的时间是0。单位为秒
示例如下:

browser.get('https://zhihu.com/explore')
#使用implicitly_wait()方法实现隐式等待
browser.implicitly_wait(10)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)

显式等待

隐式等待的效果其实并没有那么好,因为我们只规定了一个固定时间,而页面的加载时间会受到
网络条件的影响。
这里还有一种更合适的显式等待方法,它指定要查找的节点,然后指定一个最长等待时间。如果
在规定时间内加载出来了这个节点,就返回查找的节点;如果到了规定时间依然没有加载出该节点,
则抛出超时异常。
这里首先引入 WebDriverwait这个对象,指定最长等待时间,然后调用它的until()方法,传入要
等待条件expected_conditions。在expected_conditions中提供了各种等待条件详情可参考
https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html

示例如下:

browser.get('https://www.taobao.com')
wait = WebDriverWait(browser,10)
#用presence_of_all_elements_located()方法查找节点是否出现
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
#用element_to_be_clickable()方法判断节点是否可点击
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
print(input,button)

前进和后退

selenium 使用back()方法实现浏览器后退,使用forward() 方法实现浏览器前进

简单示例

browser.get("https://www.baidu.com")
browser.get("https://taobao.com")
browser.get('https://zhihu.com/explore')
browser.back()
time.sleep(10)
browser.forward()
time.sleep(10)

Cookies

Selenium还可以方便地对Cookies进行操作,比如获取、添加、删除Cookies等
示例如下

browser.get('https://www.zhihu.com/explore')
#获取Cookies
print(browser.get_cookies())
#添加Cookies
browser.add_cookie({'name':"lina",'domain':"www.zhihu.com",'value':"germey"})
print(browser.get_cookies())
#删除Cookies
browser.delete_all_cookies()
print(browser.get_cookies())

选项卡管理

Selenium可以对选项卡进行操作
示例如下:

browser.get('https://baidu.com')
 #通过执行JavaScript语句开启一个新的选项卡
browser.execute_script('window.open()')
 #调用window_handles属性获取当前开启的所有选项卡,返回的是选项卡的代号列表
print(browser.window_handles)
 #调用方法切换选项卡,其中参数是选项卡的代号
browser.switch_to_window(browser.window_handles[1])
 #在新的选项卡中打开淘宝
browser.get('https://taobao.com')
time.sleep(10)
 #切换回第一个选项卡
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
time.sleep(10)

异常处理

在使用 Selenium的过程中,难免会遇到一些异常,例如超时、节点未找到等错误,一旦出现此类
错误,程序便不会继续运行了。这里我们可以使用 try… except语句来捕获各种异常。在selenium.common.exceptions中提供了各种异常类型,详情请参考:
https://seleniumhq.github.io/selenium/docs/api/py/common/selenium.common.exceptions.html

try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time Out')
try: 
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('NO Element')
finally:
    browser.close()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值