3 WebDriver 和 WebDriver 父类
文章目录
- WebDriver
- __init__方法
- create_options方法
- execute_cdp_cmd方法
- get_network_conditions方法
- launch_app方法
- quit方法
- set_network_conditions方法
- WebDriver 父类 RemoteWebDriver 同WebDriver
- 一 Webdriver介绍
- 二webdriver实现的原理
- 三 API介绍
- Webdriver 元素的查找的八种方式
- find_element_by_id() 源码
- find_element_by_name() 源码
- find_element_by_link_text() 源码
- find_element_by_partial_link_text() 源码
- find_element_by_tag_name() 源码
- find_element_by_class_name() 源码:
- find_element_by_css_selector() 源码:
- find_elements_by_xpath() 源码
- execute_script() # JS操作源码
- 复数形式的8中元素查找源码
- 四 浏览器的基本操作
- driver.get() #打开地址
- driver.title 获取title
- current_url 获取当前页面的URL
- page_source # 返回页面的源码
- driver.refresh() #刷新
- driver.forward() # 前进
- driver.back() # 后退
- driver.maximize_window() # 最大化浏览器
- driver.minimize_window() #最小化浏览器
- 五 窗口操作
- current_window_handle() #获得当前窗口的句柄
- window_handles() #获得当前所有打开的窗口的句柄
- switch_to_window #切换窗口
- fullscreen_window # 全屏浏览器
- set_window_size #设置窗口的大小
- get_window_size #获得当前窗口的高度和大小
- set_window_position # 设置窗口的坐标
- get_window_position # 获得当前窗口的坐标
- get_window_rect 获取浏览器的大小和位置
- set_window_rect 设置浏览器的大小和位置
- 六 关闭浏览器
- driver.close()
- driver.quit()
- 七 切换
- page_source # 返回页面的源码
- switch_to_active_element # 返回当前的焦点对象
- switch_to_window # 切换窗口
- switch_to_frame
- switch_to.default_content() # 嵌套frame操作
- switch_to_alert # 进入浏览器的弹出框
- # 八 浏览器Cookie操作
- driver.get_cookies() # 获得所有cookie信息
- driver.get_cookie(name) # 返回字典的key为“name”的cookie信息
- driver.delete_cookie(name) 删除字典的key为“name”的cookie信息
- driver.delete_all_cookies() # 删除所有的cookie信息
- driver.add_cookie() #添加cookie
- 九 等待时间
- implicitly_wait() # 隐式等待
- selenium的显示等待
- 元素出现:until()
- 元素消失: until_not()
- driver.set_script_timeout()
- driver.set_page_load_timeout()
- desired_capabilities
- 十截图
- driver.get_screenshot_as_file("D:\\Test\\1.png") # 截图,并设置保存路径
- driver.save_screenshot() #保存截图
- driver.get_screenshot_as_png() #截图,保存为二进制数据
- driver.get_screenshot_as_base64() #截图,保存为base64格式
- 十一 日志
- driver.get_log()
- driver.log_types
WebDriver
__init__方法
def __init__(self, executable_path="chromedriver", port=0,options=None, service_args=None,desired_capabilities=None, service_log_path=None,chrome_options=None, keep_alive=True):
参数解释:
executable_path="chromedriver ·可执行文件的路径。如果使用默认值,则假定可执行文件位于$PATH中
def start_chrome():driver = webdriver.Chrome(executable_path='./chromedriver')
port=0 - 你希望服务运行的端口,如果为0,使用空闲端口
options=None - 这是ChromeOptions的一个实例
service_args=None - 要传递给驱动程序服务的args列表
desired_capabilities=None -仅具有非浏览器特定功能的字典对象,例如“proxy”或“loggingPref”。
service_log_path=None - 记录来自驱动程序的信息存放路径。
chrome_options=None chrome_options - chrome选项。
keep_alive=True -是否配置ChromeRemoteConnection使用HTTP keep-alive。
create_options方法
chrome_options 选项来添加定制的Chrome 来选项参数
def create_options(self):return Options() # 返回的是Options类 后续再讲
execute_cdp_cmd方法
Selenium的WebDriver类中有一个execute_cdp_cmd(self, cmd, cmd_args)方法可以用来执行Chrome开发这个工具命令。
def execute_cdp_cmd(self, cmd, cmd_args):"""Execute Chrome Devtools Protocol command and get returned resultThe command and command args should follow chrome devtools protocol domains/commands, refer to linkhttps://chromedevtools.github.io/devtools-protocol/:Args:- cmd: A str, command name- cmd_args: A dict, command args. empty dict {} if there is no command args:Usage:driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId}):Returns:A dict, empty dict {} if there is no result to return.For example to getResponseBody:{'base64Encoded': False, 'body': 'response body string'}"""return self.execute("executeCdpCommand", {'cmd': cmd, 'params': cmd_args})['value'] #执行的父类的execute函数,父类中
get_network_conditions方法
获取Chrome网络仿真设置
def get_network_conditions(self):"""Gets Chrome network emulation settings.:Returns:A dict. For example:{'latency': 4, 'download_throughput': 2, 'upload_throughput': 2,'offline': False}"""return self.execute("getNetworkConditions")['value'] #执行的父类的execute函数,父类中讲
launch_app方法
def launch_app(self, id):"""Launches Chrome app specified by id."""return self.execute("launchApp", {'id': id}) #执行的父类的execute函数,父类中讲
quit方法
def quit(self):"""Closes the browser and shuts down the ChromeDriver executablethat is started when starting the ChromeDriver"""try:RemoteWebDriver.quit(self) except Exception:# We don't care about the message because something probably has gone wrongpassfinally:self.service.stop()
如果 RemoteWebDriver.quit(self) 退出实例报错就补货异常,然后直接服务停止
set_network_conditions方法
Chrome网络仿真设置
def get_network_conditions(self):"""Gets Chrome network emulation settings.:Returns:A dict. For example:{'latency': 4, 'download_throughput': 2, 'upload_throughput': 2,'offline': False}"""return self.execute("getNetworkConditions")['value']#执行的父类的execute函数,父类中讲
WebDriver 父类 RemoteWebDriver 同WebDriver
from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver
一 Webdriver介绍
通过向远程服务器发送命令来控制浏览器。
该服务器应该运行WebDriver有线协议
属性:
- session_id - 此WebDriver启动和控制的浏览器会话的字符串ID。
- 功能 - 返回此浏览器会话的有效功能
- command_executor - 用于执行命令的remote_connection.RemoteConnection对象。- error_handler - 用于处理错误的errorhandler.ErrorHandler对象。
创建一个使用有线协议发出命令的新驱动程序。
:参数数量:- command_executor - 表示远程服务器的URL或自定义的字符串remote_connection.RemoteConnection对象。默认为“http://127.0.0.1:4444/wd/hub”。- desired_capabilities - 请求何时的功能字典启动浏览器会话。必需参数。- browser_profile - selenium.webdriver.firefox.firefox_profile.FirefoxProfile对象。仅在请求Firefox时使用。可选的。- proxy - 一个selenium.webdriver.common.proxy.Proxy对象。浏览器会话将如果可能,请使用给定的代理设置启动。可选的。- keep_alive - 是否配置要使用的remote_connection.RemoteConnectionHTTP保持活跃。默认为False。- file_detector - 在实例化期间传递自定义文件检测器对象。如果没有,然后将使用默认的LocalFileDetector()。- options - 驱动程序options.Options类的实例
二webdriver实现的原理
关于实现的原理,可以看下这个博主的总结:
webdriver实现原理
WebDriver 是按照 server – client 的经典设计模式设计的。
server 端就是 remote server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是 remote server,它的职责就是等待 client 发送请求并做出相应。client 端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的 url 等操作是以 http 请求的方式发送给被 测试浏览器,也就是 remote server;remote server 接受请求,并执行相应操作,并在 response 中返回执行状态、返回值等信息。
webdriver 的工作流程:
- WebDriver 启动目标浏览器,并绑定到指定端口。该启动的浏览器实例,做为 WebDriver 的 remote
server。 - Client 端通过 CommandExcuter 发送 HTTPRequest 给 remote server 的侦听端口(通信协议: the
webriver wire protocol) - Remote server 需要依赖原生的浏览器组件(如:IEDriverServer.exe、chromedriver.exe),来转化转
化浏览器的 native 调用
webdriver 利用的是驱动来操作浏览器中的页面元素。 具体的过程是这样的,利用各种驱动(谷歌的 chromedriver 等)来控制浏览器 ,这里也就是为什么我们每次新建一个 webdriver 对象时,需要这样定义。driver=webdriver.Chrome() 不同的浏览器需要使用不同的方法,驱动也不一样。然后操作浏览器时使用的是与浏览器之间的通信协议 The WebDriver Wire Protocol 。
每次都使用 json 来传输数据。客户端发送一个 requset,服务器端返回一个 response。代码控制驱动器然后驱动去控制浏览器 然后浏览器完成我们代码的需要的操作。
每次都需要借助一个 ComandExecutor 发送一个命令,实际上是一个 HTTP request 给监听端口上的 Web Service。在我们的 HTTP request 的 body 中,会以 WebDriver Wire 协议规定的 JSON 格式的字符串来告诉浏览器怎么做。
三 API介绍
详细的API介绍,这个从网上找的别人写好的总结,非常棒。
Webdriver 元素的查找的八种方式
1.find_element_by_id()
2.find_element_by_name()
3.find_element_by_class_name()
4.find_element_by_tag_name()
5.find_element_by_link_text()
6.find_element_by_partial_link_text()
7.find_element_by_xpath()
8.find_element_by_css_selector()
find_element_by_id() 源码
def find_element_by_id(self, id_):"""Finds an element by id.:Args:- id\_ - The id of the element to be found.:Returns:- WebElement - the element if it was found:Raises:- NoSuchElementException - if the element wasn't found:Usage:element = driver.find_element_by_id('foo')"""return self.find_element(by=By.ID, value=id_)
例子:
driver.find_element_by_id("kw")
find_element_by_name() 源码
def find_element_by_name(self, name):"""Finds an element by name.:Args:- name: The name of the element to find.:Returns:- WebElement - the element if it was found:Raises:- NoSuchElementException - if the element wasn't found:Usage:element = driver.find_element_by_name('foo')"""return self.find_element(by=By.NAME, value=name)
例子:
find_element_by_name("wd")
find_element_by_link_text() 源码
def find_element_by_link_text(self, link_text):"""Finds an element by link text.:Args:- link_text: The text of the element to be found.:Returns:- WebElement - the element if it was found:Raises:- NoSuchElementException - if the element wasn't found:Usage:element = driver.find_element_by_link_text('Sign In')"""return self.find_element(by=By.LINK_TEXT, value=link_text)
例子:
<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a>find_element_by_link_text("地图")
find_element_by_partial_link_text() 源码
parial link 定位是对 link 定们的一个种补充,有些文本连接会比较长,这个时候我们可以取文本链接的有一部分定位,只要这一部分信息可以唯一的标识这个链接。
def find_element_by_partial_link_text(self, link_text):"""Finds an element by a partial match of its link text.:Args:- link_text: The text of the element to partially match on.:Returns:- WebElement - the element if it was found:Raises:- NoSuchElementException - if the element wasn't found:Usage:element = driver.find_element_by_partial_link_text('Sign')"""return self.find_element(by=By.PARTIAL_LINK_TEXT, value=link_text)
例子:
<a class="mnav" name="tj_lang" href="#">链接非常的长长长哒哒哒哒哒哒多点对点</a>find_element_by_partial_link_text("链接非常的长")
find_element_by_tag_name() 源码
Args: tag定位取的是一个HTML页面的 tag(标签) 比如:h1, a, span
缺点:元素很多都是相同的tag,定位会不准确,不推荐使用
def find_element_by_tag_name(self, name):"""Finds an element by tag name.:Args:- name - name of html tag (eg: h1, a, span):Returns:- WebElement - the element if it was found:Raises:- NoSuchElementException - if the element wasn't found:Usage:element = driver.find_element_by_tag_name('h1')"""return self.find_element(by=By.TAG_NAME, value=name)
find_element_by_class_name() 源码:
def find_elements_by_class_name(self, name):"""Finds elements by class name.:Args:- name: The class name of the elements to find.:Returns:- list of WebElement - a list with elements if any was found. Anempty list if not:Usage:elements = driver.find_elements_by_class_name('foo')"""return self.find_elements(by=By.CLASS_NAME, value=name)
find_element_by_css_selector() 源码:
def find_element_by_css_selector(self, css_selector):"""Finds an element by css selector.:Args:- css_selector - CSS selector string, ex: 'a.nav#home':Returns:- WebElement - the element if it was found:Raises:- NoSuchElementException - if the element wasn't found:Usage:element = driver.find_element_by_css_selector('#foo')"""return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
CSS语法:
例子:
find_element_by_css_selector(".s_ipt") find_element_by_css_selector("#kw")
find_elements_by_xpath() 源码
def find_element_by_xpath(self, xpath):"""Finds an element by xpath.:Args:- xpath - The xpath locator of the element to find.:Returns:- WebElement - the element if it was found:Raises:- NoSuchElementException - if the element wasn't found:Usage:element = driver.find_element_by_xpath('//div/td[1]')"""return self.find_element(by=By.XPATH, value=xpath)
例子:
find_element_by_xpath("//input[@id='kw']")
execute_script() # JS操作源码
def execute_script(self, script, *args):"""Synchronously Executes JavaScript in the current window/frame.:Args:- script: The JavaScript to execute.- \*args: Any applicable arguments for your JavaScript.:Usage:driver.execute_script('return document.title;')"""converted_args = list(args)command = Noneif self.w3c:command = Command.W3C_EXECUTE_SCRIPTelse:command = Command.EXECUTE_SCRIPTreturn self.execute(command, {'script': script,'args': converted_args})['value']
例子:
js="return $('#nv a')"link = driver.execute_script(js)
复数形式的8中元素查找源码
1.find_elements_by_id()
2.find_elements_by_name()
3.find_elements_by_class_name()
4.find_elements_by_tag_name()
5.find_elements_by_link_text()
6.find_elements_by_partial_link_text()
7.find_elements_by_xpath()
8.find_elements_by_css_selector()
四 浏览器的基本操作
driver.get() #打开地址
例子:
from selenium import webdriverdriver = webdriver.FireFox()driver.get("http://www.baidu.com")
driver.title 获取title
@property #装饰器的意思返回新式类属性。def title(self):"""Returns the title of the current page.:Usage:title = driver.title"""resp = self.execute(Command.GET_TITLE)return resp['value'] if resp['value'] is not None else ""
列子:
import time
from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.baidu.com/")
time.sleep(1)
driver.find_element_by_link_text("新闻").click()
time.sleep(1)
print (driver.title) # title方法可以获取当前页面的标题显示的字段
current_url 获取当前页面的URL
@propertydef current_url(self):"""Gets the URL of the current page.:Usage:driver.current_url"""return self.execute(Command.GET_CURRENT_URL)['value']
例子:
import time
from selenium import webdriverdriver = webdriver.FireFox()
drive.get("https://www.baidu.com")
driver.find_element_by_link_text("新闻").click()current_url = driver.current_url # 获取当前页面的url
print(current_url)
driver.quit()
page_source # 返回页面的源码
用途:当你8大元素定位都定位不到时候,你可以用这个试试,获取到页面信息,用正则提取出我们想要的东西
@propertydef page_source(self):"""Gets the source of the current page.:Usage:driver.page_source"""return self.execute(Command.GET_PAGE_SOURCE)['value']
例子:
from selenium import webdriverdriver = webdriver.FireFox()
driver.get("https://blog.csdn.net/ricky_yangrui")
page = driver.page_source
print(page)
driver.refresh() #刷新
def refresh(self):"""Refreshes the current page.:Usage:driver.refresh()"""self.execute(Command.REFRESH)
例子:
from selenium import webdriverimport timedriver = webdriver.FireFox()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.refresh()
driver.forward() # 前进
def forward(self):"""Goes one step forward in the browser history.:Usage:driver.forward()"""self.execute(Command.GO_FORWARD)
例子:
在这里插入代码片
driver.back() # 后退
def back(self):"""Goes one step backward in the browser history.:Usage:driver.back()"""self.execute(Command.GO_BACK)
例子:
from selenium import webdriver
import timedriver = webdriver.FireFox()
driver.get("https://www.baidu.com")
time.sleep(2)
driver.get("https://www.hao123.com")
time.sleep(2)
# 返回到上一页
driver.back()
time.sleep(3)
# 切换到下一页
driver.forward()
driver.maximize_window() # 最大化浏览器
def maximize_window(self):"""Maximizes the current window that webdriver is using"""params = Nonecommand = Command.W3C_MAXIMIZE_WINDOWif not self.w3c:command = Command.MAXIMIZE_WINDOWparams = {'windowHandle': 'current'}self.execute(command, params)
例子:
import time
from selenium import webdriver
import re
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
time.sleep(2)
driver.maximize_window()
driver.minimize_window() #最小化浏览器
def minimize_window(self):"""Invokes the window manager-specific 'minimize' operation"""self.execute(Command.MINIMIZE_WINDOW)
例子:
import time
from selenium import webdriver
import re
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
time.sleep(2)
driver.minimize_window()
五 窗口操作
current_window_handle() #获得当前窗口的句柄
def current_window_handle(self):"""Returns the handle of the current window.:Usage:driver.current_window_handle"""if self.w3c:return self.execute(Command.W3C_GET_CURRENT_WINDOW_HANDLE)['value']else:return self.execute(Command.GET_CURRENT_WINDOW_HANDLE)['value']
例子:
在这里插入代码片
window_handles() #获得当前所有打开的窗口的句柄
@propertydef window_handles(self):"""Returns the handles of all windows within the current session.:Usage:driver.window_handles"""if self.w3c:return self.execute(Command.W3C_GET_WINDOW_HANDLES)['value']else:return self.execute(Command.GET_WINDOW_HANDLES)['value']
例子:
在这里插入代码片
switch_to_window #切换窗口
def switch_to_window(self, window_name):""" Deprecated use driver.switch_to.window"""warnings.warn("use driver.switch_to.window instead",DeprecationWarning, stacklevel=2)self._switch_to.window(window_name)
例子:
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
#获得百度搜索窗口句柄
sreach_windows= driver.current_window_handle
driver.find_element_by_link_text(u'登录').click()
driver.find_element_by_link_text(u"立即注册").click()#获得当前所有打开的窗口的句柄
all_handles = driver.window_handles
#进入注册窗口
for handle in all_handles:if handle != sreach_windows:driver.switch_to_window(handle)print 'now register window!'driver.find_element_by_name("account").send_keys('username')driver.find_element_by_name('password').send_keys('password')
#……
#进入搜索窗口
for handle in all_handles:if handle == sreach_windows:driver.switch_to_window(handle)print 'now sreach window!'driver.find_element_by_id('TANGRAM__PSP_2__closeBtn').click()driver.find_element_by_id("kw").send_keys("selenium")driver.find_element_by_id("su").click()time.sleep(5)
fullscreen_window # 全屏浏览器
def fullscreen_window(self):"""Invokes the window manager-specific 'full screen' operation"""self.execute(Command.FULLSCREEN_WINDOW)
例子:
import time
from selenium import webdriver
import re
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
time.sleep(2)
# 全屏
driver.fullscreen_window()
set_window_size #设置窗口的大小
def set_window_size(self, width, height, windowHandle='current'):"""Sets the width and height of the current window. (window.resizeTo):Args:- width: the width in pixels to set the window to- height: the height in pixels to set the window to:Usage:driver.set_window_size(800,600)"""if self.w3c:if windowHandle != 'current':warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")self.set_window_rect(width=int(width), height=int(height))else:self.execute(Command.SET_WINDOW_SIZE, {'width': int(width),'height': int(height),'windowHandle': windowHandle})
例子:
# 设置窗口大小500 * 234
driver.set_window_size(500, 234)
get_window_size #获得当前窗口的高度和大小
def get_window_size(self, windowHandle='current'):"""Gets the width and height of the current window.:Usage:driver.get_window_size()"""command = Command.GET_WINDOW_SIZEif self.w3c:if windowHandle != 'current':warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")size = self.get_window_rect()else:size = self.execute(command, {'windowHandle': windowHandle})if size.get('value', None) is not None:size = size['value']return {k: size[k] for k in ('width', 'height')}
例子:
在这里插入代码片
set_window_position # 设置窗口的坐标
def set_window_position(self, x, y, windowHandle='current'):"""Sets the x,y position of the current window. (window.moveTo):Args:- x: the x-coordinate in pixels to set the window position- y: the y-coordinate in pixels to set the window position:Usage:driver.set_window_position(0,0)"""if self.w3c:if windowHandle != 'current':warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")return self.set_window_rect(x=int(x), y=int(y))else:self.execute(Command.SET_WINDOW_POSITION,{'x': int(x),'y': int(y),'windowHandle': windowHandle})
例子:
在这里插入代码片
get_window_position # 获得当前窗口的坐标
def get_window_position(self, windowHandle='current'):"""Gets the x,y position of the current window.:Usage:driver.get_window_position()"""if self.w3c:if windowHandle != 'current':warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")position = self.get_window_rect()else:position = self.execute(Command.GET_WINDOW_POSITION,{'windowHandle': windowHandle})['value']return {k: position[k] for k in ('x', 'y')}
例子:
在这里插入代码片
get_window_rect 获取浏览器的大小和位置
def get_window_rect(self):"""Gets the x, y coordinates of the window as well as height and width ofthe current window.:Usage:driver.get_window_rect()"""return self.execute(Command.GET_WINDOW_RECT)['value']
例子:
在这里插入代码片
set_window_rect 设置浏览器的大小和位置
def set_window_rect(self, x=None, y=None, width=None, height=None):"""Sets the x, y coordinates of the window as well as height and width ofthe current window.:Usage:driver.set_window_rect(x=10, y=10)driver.set_window_rect(width=100, height=200)driver.set_window_rect(x=10, y=10, width=100, height=200)"""if (x is None and y is None) and (height is None and width is None):raise InvalidArgumentException("x and y or height and width need values")return self.execute(Command.SET_WINDOW_RECT, {"x": x, "y": y,"width": width,"height": height})['value']
例子:
六 关闭浏览器
close用于关闭当前窗口,当打开的窗口较多时,就可以用close关闭部分窗口
quit用于结束进程,关闭所有的窗口 Note: 有时候写driver.close() 会报错
sys.meta_path is None, Python is likely shutting down,这个我们看源代码就发现了,close只是关闭其中一个窗口,并没有关闭进程,看quit() ,就发现了,他是关闭了进程的 self.stop_client() ,遇到这个报错的时候,我们可以使用driver.quit() 试试。
driver.close()
def close(self):"""Closes the current window.:Usage:driver.close()"""self.execute(Command.CLOSE)
例子:
driver.quit()
def quit(self):"""Quits the driver and closes every associated window.:Usage:driver.quit()"""try:self.execute(Command.QUIT)finally:self.stop_client()
例子:
七 切换
page_source # 返回页面的源码
def switch_to(self):""":Returns:- SwitchTo: an object containing all options to switch focus into:Usage:element = driver.switch_to.active_elementalert = driver.switch_to.alertdriver.switch_to.default_content()driver.switch_to.frame('frame_name')driver.switch_to.frame(1)driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])driver.switch_to.parent_frame()driver.switch_to.window('main')"""return self._switch_to
例子:
element = driver.switch_to.active_element
alert = driver.switch_to.alert
driver.switch_to.default_content()
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
driver.switch_to.parent_frame()
driver.switch_to.window('main')
alert ——返回浏览器的Alert对象,可对浏览器alert、confirm、prompt框操作
default_content() ——切到主文档
frame(frame_reference) ——切到某个frame
parent_frame() ——切到父frame,这个方法也不常被人所知,但有多层frame的时候很有用
window(window_name) ——切到某个浏览器窗口
active_element ——返回当前焦点的WebElement对象
switch_to_active_element # 返回当前的焦点对象
焦点就是我们操作网页的时候,光标的位置;
例子:我们常用的就是新建文件夹的时候,点击了右键,新建,我们的光标就会到新建的文件夹上,这个时候我们要输入名字,光标是在文件夹里面闪动的,这个时候我们就可以用 switch_to_active_element 去输入名字,完成新建文件夹的操作;
def switch_to_active_element(self):""" Deprecated use driver.switch_to.active_element"""warnings.warn("use driver.switch_to.active_element instead",DeprecationWarning, stacklevel=2)return self._switch_to.active_element
例子:
l = driver.find_element_by_id('pm_treeRoom_1_span')
ActionChains(driver).context_click(l).perform()driver.find_element_by_class_name('fnew').click()
time.sleep(2)
driver.switch_to.active_element.send_keys('filename')
time.sleep(2)
switch_to_window # 切换窗口
def switch_to_window(self, window_name):""" Deprecated use driver.switch_to.window"""warnings.warn("use driver.switch_to.window instead",DeprecationWarning, stacklevel=2)self._switch_to.window(window_name)
例子:
switch_to_frame
这个方法假如被划了横线,那我们用 switch_to.frame
switch_to_frame(self, frame_reference):""" Deprecated use driver.switch_to.frame"""warnings.warn("use driver.switch_to.frame instead",DeprecationWarning, stacklevel=2)self._switch_to.frame(frame_reference)
例子:
frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作
<body>
<iframe src="a.html" id="frame1" name="myframe"></iframe>
</body>
</html>driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0
# driver.switch_to.frame("frame1") # 2.用id来定位
# driver.switch_to.frame("myframe") # 3.用name来定位
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # # 4.用WebElement对象
切换进入了,如何切换回来?
driver.switch_to.default_content()
switch_to.default_content() # 嵌套frame操作
def switch_to_default_content(self):""" Deprecated use driver.switch_to.default_content"""warnings.warn("use driver.switch_to.default_content instead",DeprecationWarning, stacklevel=2)self._switch_to.default_content()
例子:
<html><iframe id="frame1"><iframe id="frame2" / ></iframe>
</html># 一层一层的进入
driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")# 从frame2再切回frame1,这里selenium给我们提供了一个方法能够从
子frame切回到父frame,而不用我们切回主文档再切进来。相当于 back
driver.switch_to.parent_frame() # 如果当前已是主文档,则无效果# 切到 “frame1” 下的 “第一个frame” 下的 “frame3” 中
driver.switch_to.frame('frame1.0.frame3')
switch_to_alert # 进入浏览器的弹出框
def switch_to_alert(self):""" Deprecated use driver.switch_to.alert"""warnings.warn("use driver.switch_to.alert instead",DeprecationWarning, stacklevel=2)return self._switch_to.alert
例子:
switch_to_alert 和switch_to_window的区别?
alert:浏览器的弹出框
window:浏览器的窗口,我们点一个链接,会跳转到另外一个窗口中。alert和window是父子关系,alert必须依托某一个窗口
div对话框: 这个我们打开F12,可以看到他的元素,能够直接的定位。
alert的操作
selenium.webdriver.common.alert.Alert(driver)
Alert(driver).accept() # 确认
Alert(driver).dismiss() # 取消
Alert(driver).authenticate(username,password) # 验证,针对需要身份验证的alert
Alert(driver).send_keys(keysToSend) # 发送文本,对有提交需求的prompt框
Alert(driver).text # 获取alert文本内容,对有信息显示的alert框
# 八 浏览器Cookie操作
cookie的结构和具体的信息
cookie ={u'domain': u'.cnblogs.com',u'name': u'.CNBlogsCookie',u'value': u'xxxx',u'expiry': 1491887887,u'path': u'/',u'httpOnly': True,u'secure': False}name:cookie的名称value:cookie对应的值,动态生成的domain:服务器域名expiry:Cookie有效终止日期path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的CookiehttpOnly:防脚本攻击secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。
driver.get_cookies() # 获得所有cookie信息
def get_cookies(self):"""Returns a set of dictionaries, corresponding to cookies visible in the current session.:Usage:driver.get_cookies()"""return self.execute(Command.GET_ALL_COOKIES)['value']
例子:
from selenium import webdriverdriver = webdriver.Firefox()
driver.get("http://www.baidu.com")# 获取cookie信息
cookie = driver.get_cookies()
print(cookie)driver.quit()
结果:cookie数据是以字典的形式进行存放的。
driver.get_cookie(name) # 返回字典的key为“name”的cookie信息
def get_cookies(self):"""Returns a set of dictionaries, corresponding to cookies visible in the current session.:Usage:driver.get_cookies()"""return self.execute(Command.GET_ALL_COOKIES)['value']
例子:
driver.delete_cookie(name) 删除字典的key为“name”的cookie信息
def delete_cookie(self, name):"""Deletes a single cookie with the given name.:Usage:driver.delete_cookie('my_cookie')"""self.execute(Command.DELETE_COOKIE, {'name': name})
例子:
driver.delete_all_cookies() # 删除所有的cookie信息
def delete_all_cookies(self):"""Delete all cookies in the scope of the session.:Usage:driver.delete_all_cookies()"""self.execute(Command.DELETE_ALL_COOKIES)
例子:
driver.add_cookie() #添加cookie
def add_cookie(self, cookie_dict):"""Adds a cookie to your current session.:Args:- cookie_dict: A dictionary object, with required keys - "name" and "value";optional keys - "path", "domain", "secure", "expiry"Usage: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})"""self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
利用add_cookie 我们可以绕过登录的验证码。在登录的时候勾选记住密码,当下次访问该网站时就默认处于登录状态了。记住密码功能其实就记录了浏览器的cookie中。通过webdriver来操作浏览器的cookie,可以通过add_cookie()方法将用户名密码写入浏览器cookie,当再次访问时,服务器将直接读取浏览器的cookie进行登录。
Note:登录的时候需要勾选 下次自动登录按钮。没有记住登录状态的不合适
九 等待时间
implicitly_wait() # 隐式等待
def implicitly_wait(self, time_to_wait):"""Sets a sticky timeout to implicitly wait for an element to be found,or a command to complete. This method only needs to be called onetime per session. To set the timeout for calls toexecute_async_script, see set_script_timeout.:Args:- time_to_wait: Amount of time to wait (in seconds):Usage:driver.implicitly_wait(30)"""if self.w3c:self.execute(Command.SET_TIMEOUTS, {'implicit': int(float(time_to_wait) * 1000)})else:self.execute(Command.IMPLICIT_WAIT, {'ms': float(time_to_wait) * 1000})
例子:
原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素
implicity_wait()默认参数的单位为妙,本例中设置等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位是,如果元素可以定位,则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.implicity_wait(10)
driver.get('http://www.baidu')
selenium的显示等待
原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久跳出Exception
(就是直到元素出现才去操作,如果超时则报异常)
from selenium.webdriver.support.wait import WebDriverWait
class WebDriverWait(object):def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):"""Constructor, takes a WebDriver instance and timeout in seconds.:Args:- driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote)- timeout - Number of seconds before timing out- poll_frequency - sleep interval between callsBy default, it is 0.5 second.- ignored_exceptions - iterable structure of exception classes ignored during calls.By default, it contains NoSuchElementException only.Example:from selenium.webdriver.support.ui import WebDriverWait \nelement = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) \nis_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\ \nuntil_not(lambda x: x.find_element_by_id("someId").is_displayed())"""self._driver = driverself._timeout = timeoutself._poll = poll_frequency# avoid the divide by zeroif self._poll == 0:self._poll = POLL_FREQUENCYexceptions = list(IGNORED_EXCEPTIONS)if ignored_exceptions is not None:try:exceptions.extend(iter(ignored_exceptions))except TypeError: # ignored_exceptions is not iterableexceptions.append(ignored_exceptions)self._ignored_exceptions = tuple(exceptions)def __repr__(self):return '<{0.__module__}.{0.__name__} (session="{1}")>'.format(type(self), self._driver.session_id)def until(self, method, message=''):"""Calls the method provided with the driver as an argument until the \return value is not False."""screen = Nonestacktrace = Noneend_time = time.time() + self._timeoutwhile True:try:value = method(self._driver)if value:return valueexcept self._ignored_exceptions as exc:screen = getattr(exc, 'screen', None)stacktrace = getattr(exc, 'stacktrace', None)time.sleep(self._poll)if time.time() > end_time:breakraise TimeoutException(message, screen, stacktrace)def until_not(self, method, message=''):"""Calls the method provided with the driver as an argument until the \return value is False."""end_time = time.time() + self._timeoutwhile True:try:value = method(self._driver)if not value:return valueexcept self._ignored_exceptions:return Truetime.sleep(self._poll)if time.time() > end_time:breakraise TimeoutException(message)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get('http://www.baidu')element = WebDriverWait(driver,5,0.5).util(EC.presence_of_element_located((By.ID,'kw')))
element.send_keys('hello')
driver.quit()WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超过时间,默认以秒为单位
poll_frequency:监测的时间间隔,默认为0.5秒
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
WebDriverWait一般有until和until_not方法配合使用
until(method,message)
until_not(method ,message)
例子:
元素出现:until()
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 等待时长10秒,默认0.5秒询问一次
WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("kw")).send_keys("test")
例子:
元素消失: until_not()
# 判断id为kw元素是否消失
is_disappeared = WebDriverWait(driver, 10, 1).\until_not(lambda x: x.find_element_by_id("kw").is_displayed())
print is_disappeared
例子:
driver.set_script_timeout()
例子:
driver.set_page_load_timeout()
例子:
desired_capabilities
@propertydef desired_capabilities(self):"""returns the drivers current desired capabilities being used"""return self.capabilities
例子:
十截图
driver.get_screenshot_as_file(“D:\Test\1.png”) # 截图,并设置保存路径
def get_screenshot_as_file(self, filename):"""Saves a screenshot of the current window to a PNG image file. ReturnsFalse if there is any IOError, else returns True. Use full paths inyour filename.:Args:- filename: The full path you wish to save your screenshot to. Thisshould end with a `.png` extension.:Usage:driver.get_screenshot_as_file('/Screenshots/foo.png')"""if not filename.lower().endswith('.png'):warnings.warn("name used for saved screenshot does not match file ""type. It should end with a `.png` extension", UserWarning)png = self.get_screenshot_as_png()try:with open(filename, 'wb') as f:f.write(png)except IOError:return Falsefinally:del pngreturn True
例子:
driver.save_screenshot() #保存截图
def save_screenshot(self, filename):"""Saves a screenshot of the current window to a PNG image file. ReturnsFalse if there is any IOError, else returns True. Use full paths inyour filename.:Args:- filename: The full path you wish to save your screenshot to. Thisshould end with a `.png` extension.:Usage:driver.save_screenshot('/Screenshots/foo.png')"""return self.get_screenshot_as_file(filename)
例子:
driver.get_screenshot_as_png() #截图,保存为二进制数据
def get_screenshot_as_png(self):"""Gets the screenshot of the current window as a binary data.:Usage:driver.get_screenshot_as_png()"""return base64.b64decode(self.get_screenshot_as_base64().encode('ascii'))
例子:
driver.get_screenshot_as_base64() #截图,保存为base64格式
例子:
十一 日志
driver.get_log()
def get_log(self, log_type):"""Gets the log for a given log type:Args:- log_type: type of log that which will be returned:Usage:driver.get_log('browser')driver.get_log('driver')driver.get_log('client')driver.get_log('server')"""return self.execute(Command.GET_LOG, {'type': log_type})['value']
例子:
driver.log_types
@property
def log_types(self):"""Gets a list of the available log types:Usage:driver.log_types"""return self.execute(Command.GET_AVAILABLE_LOG_TYPES)['value']
例子:
driver = webdriver.FireFox()
driver.log_types
Out[36]: ['browser', 'driver']driver.get_log("driver")
Out[37]: []driver.get_log('browser')
Out[38]: []
其中get_log的参数可以从log_types获取。get_log(‘browser’) 输出chrome控制台的各种日志信息。其中取一次后,就清空。get_log(‘driver’)还没有观察到输出
原文来自
3 WebDriver 和 WebDriver 父类相关推荐
- selenium webdriver 使用webDriver点击ENTER建的两种方法
使用webDriver点击ENTER建的两种方法:. First: driver.findElement(By.id("idValue")).sendKeys(Keys.ENTER ...
- python和selenium的关系_selenium之python源码解读-webdriver继承关系
一.webdriver继承关系 在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\re ...
- WebDriver·TestNg学习日志(Java/Ruby/.Net版)
目录 WebDriver(JAVA)拾级而上 WebDriver拾级而上·之零 WebDriver理论 WebDriver拾级而上·之一 环境部署 WebDriver拾级而上·之二 浏览器操作 Web ...
- 一行js代码识别Selenium+Webdriver及其应对方案
有不少朋友在开发爬虫的过程中喜欢使用Selenium + Chromedriver,以为这样就能做到不被网站的反爬虫机制发现. 先不说淘宝这种基于用户行为的反爬虫策略,仅仅是一个普通的小网站,使用一行 ...
- WebDriver 识别反爬虫的原理和破解方法~
作者|志斌 来源|python笔记 有时候我们在爬取动态网页的时候,会借助渲染工具来进行爬取,这个"借助"实际上就是通过使用相应的浏览器驱动(即WebDriver)向浏览器发出命令 ...
- 使用Python在Selenium WebDriver中获取WebElement的HTML源代码
我正在使用Python绑定来运行Selenium WebDriver. from selenium import webdriver wd = webdriver.Firefox() 我知道我可以抓住 ...
- Selenium Webdriver原理终于搞清楚了
目录 1. Selenium的历史 2. WebDriver协议 3. Selenium驱动浏览器原理 4. 测试代码与Webdriver的交互 5. Webdriver与浏览器的关系 6. Sele ...
- 第三章 python webdriver API(一)——浏览器操作
浏览器的操作 浏览器最大化 from selenium import webdriver driver = webdriver.Firefox() driver.get("https://w ...
- python webdriver点击指令_测开系列Selenium Webdriver Python(20)--Webdriver运行原理
Webdriver运行原理 转帖请注明出处!谢谢 在开发Webdriver的自动化脚本过程中,Webdriver后台在创建WebDriver实例的过程中,先确认浏览器的原生组件中是否存在可匹配的版本. ...
最新文章
- (译)在Objective-c里面使用property教程
- 基于Redis的MQ中间件实现-目录
- 前端实现图片悬浮_悬浮图片之上效果实现
- Simulink之功率场效应晶体管(P-MOSFET)
- C语言函数一章教学,C语言-第1章教学案.doc
- 微软MIX Factory大会系列-设计师 vs 开发者 Who is the WINNER?
- Wowza服务器系列(4):使用rtmp协议向wowza推流的wowoza配置方法
- Linux性能优化(五)——性能监控工具
- 蓝蓝设计 扁平化界面风格的设计
- 洛谷_P1007 独木桥_思维
- 计算机维修logo在线设计,硕思logo设计师电脑版
- matlab的peer啥意思,科学网—Matlab读取PEER地震动记录数据库加速度数据函数 - 王德才的博文...
- python 怎么输出实际的根号2_Python怎么输出根式?
- 一位沪漂 11 年的程序员老兵,回老家了!
- shell du命令
- H5移动端网页自定义扫码
- Kafka(9)副本(leader、flower、isr说明)
- 你还在纠结器件丝印放错的烦恼么?
- 优秀的数据产品经理需要掌握哪些技能?
- “cannot simultaneously fetch multiple bags”的解决方法
热门文章
- 红图新媒体-完美的新媒体矩阵方案需要这样做
- Java实现简易的界面通讯录
- 2.PRT文件的解析
- Ubuntu运行roscore时候报错 Unable to contact my own server at xxx的解决方法
- U盘中SLC、MLC和TLC三者闪存类型的优缺点及区别
- 【第72题】JAVA高级技术-多线程6(模拟银行系统存钱)
- 未来从事计算机职业规划,计算机专业职业生涯规划书2000字
- 计算机全选的键盘,什么是全选快捷键,我将告诉您什么是计算机全选快捷键
- Opencv 环境安装以及学习图像处理知识总结(附代码)(一)
- Flink结合Iceberg的一种实现方式笔记