一、webdriver继承关系
在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\remote下webdriver.py中的WebDriver 类,如下
chrome WebDriver
selenium\webdriver\chrome下webdriver.py中WebDriver定义如下
from selenium.webdriver.remote.webdriver importWebDriver as RemoteWebDriverclassWebDriver(RemoteWebDriver):”””Controls the ChromeDriver and allows you to drive the browser.”””
firefox WebDriver
selenium\webdriver\firefox 下webdriver.py中WebDriver定义如下
from selenium.webdriver.remote.webdriver importWebDriver as RemoteWebDriverclassWebDriver(RemoteWebDriver):pass
ie WebDriver
selenium\webdriver\ie 下webdriver.py中WebDriver定义如下
from selenium.webdriver.remote.webdriver importWebDriver as RemoteWebDriverclassWebDriver(RemoteWebDriver):def __init__(self, executable_path=’IEDriverServer.exe’, capabilities=None,
port=DEFAULT_PORT, timeout=DEFAULT_TIMEOUT, host=DEFAULT_HOST,
log_level=DEFAULT_LOG_LEVEL, log_file=DEFAULT_LOG_FILE):
……
如上源码:from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver 都是继承至RemoteWebDriver ,并主要重写__init__方法
其他方法主要继承至父类RemoteWebDriver ,因此着重看下RemoteWebDriver 类中的方法
1、find类
编写脚本常用的查找页面元素方法
deffind_element_by_id(self, id_):#Finds an element by id.”’
pass
deffind_elements_by_id(self, id_):#Finds multiple elements by id.
pass
deffind_element_by_xpath(self, xpath):#Finds an element by xpath.
pass
deffind_elements_by_xpath(self, xpath):#Finds multiple elements by xpath.
pass
deffind_element_by_link_text(self, link_text):#Finds an element by link text
pass
deffind_elements_by_link_text(self, text):#Finds elements by link text.
pass
deffind_element_by_partial_link_text(self, link_text):#Finds elements by a partial match of their link text.
pass
deffind_elements_by_partial_link_text(self, link_text):#Finds an element by a partial match of its link text.
pass
deffind_element_by_name(self, name):#Finds an element by name.
pass
deffind_elements_by_name(self, name):#Finds elements by name.
pass
deffind_element_by_tag_name(self, name):#Finds an element by tag name.
pass
deffind_elements_by_tag_name(self, name):#Finds elements by tag name.
pass
deffind_element_by_class_name(self, name):
Finds an element byclassname.pass
deffind_elements_by_class_name(self, name):#Finds elements by class name.
pass
deffind_element_by_css_selector(self, css_selector):#Finds an element by css selector.
pass
deffind_elements_by_css_selector(self, css_selector):#Finds elements by css selector.
pass
def find_element(self, by=By.ID, value=None):#’Private’ method used by the find_element_by_* methods.
pass
def find_elements(self, by=By.ID, value=None):#’Private’ method used by the find_elements_by_* methods.
pass
通过查看源码,其实以上方法都是通过调用
self.find_element(by=By.XXX, value=name)或者self.find_elements(by=By.XXX, value=name)方法来重新定义的
def find_element(self, by=By.ID, value=None):”””‘Private’ method used by the find_element_by_* methods.
:Usage:
Use the corresponding find_element_by_* instead of this.
:rtype: WebElement”””
ifself.w3c:if by ==By.ID:
by=By.CSS_SELECTOR
value= ‘[id=”%s”]’ %valueelif by ==By.TAG_NAME:
by=By.CSS_SELECTORelif by ==By.CLASS_NAME:
by=By.CSS_SELECTOR
value= “.%s” %valueelif by ==By.NAME:
by=By.CSS_SELECTOR
value= ‘[name=”%s”]’ %valuereturnself.execute(Command.FIND_ELEMENT, {‘using’: by,’value’: value})[‘value’]
其中by.XXX是selenium\webdriver\common下by.py文件中By类定义的静态常量
classBy(object):”””Set of supported locator strategies.”””ID= “id”XPATH= “xpath”LINK_TEXT= “link text”PARTIAL_LINK_TEXT= “partial link text”NAME= “name”TAG_NAME= “tag name”CLASS_NAME= “class name”CSS_SELECTOR= “css selector”
通过以上分析,不难发现,只要掌握了self.find_element(by=By.XXX, value=name)或者self.find_elements(by=By.XXX, value=name)方法,已就意味着掌握了全部的查找定位页面元素的方法
2、除了常用的find类方法外,以下方法在编写脚本是也是常用的
ef get(self, url):”””Loads a web page in the current browser session.”””@propertydeftitle(self):”””Returns the title of the current page.”””@propertydefcurrent_url(self):”””Gets the URL of the current page.”””@propertydefcurrent_window_handle(self):”””Returns the handle of the current window.”””
defmaximize_window(self):”””Maximizes the current window that webdriver is using”””@propertydefswitch_to(self):returnself._switch_to#Target Locators
defswitch_to_active_element(self):”””Deprecated use driver.switch_to.active_element”””
defswitch_to_window(self, window_name):”””Deprecated use driver.switch_to.window”””
defswitch_to_frame(self, frame_reference):”””Deprecated use driver.switch_to.frame”””
defswitch_to_default_content(self):”””Deprecated use driver.switch_to.default_content”””
defswitch_to_alert(self):”””Deprecated use driver.switch_to.alert”””
其中使用@property修饰的,可以当作为属性来使用,如driver.current_url
3、为什么在实际应用过程中通过from selenium import webdriver引入webdriver,然后通过webdriver.Chrome()就可以实例化Chrome的Driver对象呢?
从以上selenium目录结构,理论上需要通过以下来导入
#导入chrome的WebDriver
from selenium.webdriver.chrome.webdriver importWebDriver#导入firefox的WebDriver
from selenium.webdriver.firefox.webdriver importWebDriver#导入ie的WebDriver
from selenium.webdriver.ie.webdriver import WebDriver
selenium项目目录结构
selenium
│ __init__.py
│
├─common
│ │ exceptions.py
│ │ __init__.py
│
├─webdriver
│ │ __init__.py
│ │
│ ├─android
│ │ │ webdriver.py
│ │ │ __init__.py
│ │
│ ├─blackberry
│ │ │ webdriver.py
│ │ │ __init__.py
│ │
│ ├─chrome
│ │ │ options.py
│ │ │ remote_connection.py
│ │ │ service.py
│ │ │ webdriver.py
│ │ │ __init__.py
│ │
│ ├─common
│ │ │ action_chains.py
│ │ │ alert.py
│ │ │ by.py
│ │ │ desired_capabilities.py
│ │ │ keys.py
│ │ │ proxy.py
│ │ │ service.py
│ │ │ touch_actions.py
│ │ │ utils.py
│ │ │ __init__.py
│ │ │
│ │ ├─actions
│ │ │ │ action_builder.py
│ │ │ │ input_device.py
│ │ │ │ interaction.py
│ │ │ │ key_actions.py
│ │ │ │ key_input.py
│ │ │ │ mouse_button.py
│ │ │ │ pointer_actions.py
│ │ │ │ pointer_input.py
│ │ │ │ __init__.py
│ │ │
│ │ │
│ │ ├─html5
│ │ │ │ application_cache.py
│ │ │ │ __init__.py
│ │
│ ├─edge
│ │ │ options.py
│ │ │ service.py
│ │ │ webdriver.py
│ │ │ __init__.py
│ ├─firefox
│ │ │ extension_connection.py
│ │ │ firefox_binary.py
│ │ │ firefox_profile.py
│ │ │ options.py
│ │ │ remote_connection.py
│ │ │ service.py
│ │ │ webdriver.py
│ │ │ webdriver.xpi
│ │ │ webdriver_prefs.json
│ │ │ webelement.py
│ │ │ __init__.py
│ │
│ ├─ie
│ │ │ service.py
│ │ │ webdriver.py
│ │ │ __init__.py
│ ├─opera
│ │ │ options.py
│ │ │ webdriver.py
│ │ │ __init__.py
│ ├─phantomjs
│ │ │ service.py
│ │ │ webdriver.py
│ │ │ __init__.py
│ ├─remote
│ │ │ command.py
│ │ │ errorhandler.py
│ │ │ file_detector.py
│ │ │ getAttribute.js
│ │ │ isDisplayed.js
│ │ │ mobile.py
│ │ │ remote_connection.py
│ │ │ switch_to.py
│ │ │ utils.py
│ │ │ webdriver.py
│ │ │ webelement.py
│ │ │ __init__.py
│ ├─safari
│ │ │ service.py
│ │ │ webdriver.py
│ │ │ __init__.py
│ ├─support
│ │ │ abstract_event_listener.py
│ │ │ color.py
│ │ │ events.py
│ │ │ event_firing_webdriver.py
│ │ │ expected_conditions.py
│ │ │ select.py
│ │ │ ui.py
│ │ │ wait.py
│ │ │ __init__.py
通过查看selenium\webdriver下__init__.py文件发现
from .firefox.webdriver import WebDriver as Firefox #noqa
from .firefox.firefox_profile import FirefoxProfile #noqa
from .chrome.webdriver import WebDriver as Chrome #noqa
from .chrome.options import Options as ChromeOptions #noqa
from .ie.webdriver import WebDriver as Ie #noqa
其实是因为该出已经导入了,所以才可以直接使用Firefox、Chrome