selenium源码分析

1、webdriver模块

1)在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\remote下

webdriver.py中的WebDriver 类。

2)着重看下Remote下的WebDriver类中的方法:

一、全局操作类

start_session 使用指定的desired capabilities创建一个会话(session)

start_client 新建一个webdriver会话session前调用,可以自定义初始化的动作

stop_client 停止webdriver会话session后调用,可以自定义一些清理动作

create_web_element 创建一个html元素

get 在当前浏览器会话页打开指定的的url网页

close 关闭当前浏览器窗口

quit 关闭webdirver会话,并把所有与该会话关联的浏览器窗口一起关闭

forward/back 浏览器历史浏览上一次/下一次操作

refresh 刷新浏览器

set_script_timeout 设置脚本执行超时时间

set_page_load_timeout 设置页面加载超时时间

get_screenshot_as_file 截图并保存为文件

get_screenshot_as_png 截图并保存为png格式文件

get_screenshot_as_base64 截图成base64串

get_cookies/delete_all_cookies 获取/删除所有cookie

get_cookie/delete_cookie 获取/删除指定的cookie

二、元素定位类

find_element_by_id/find_elements_by_id 通过id查找一个或多个元素

find_element_by_xpath/find_elements_by_xpath 通过xpath查找一个或多个元素

find_element_by_link_text/find_elements_by_link_text 通过链接文本查找一个或多个元素(全匹配模式)

find_element_by_partial_link_text/find_elements_by_partial_link_text通过部分链接文本查找一个或多个元素(部分匹配模式)

find_element_by_name/find_elements_by_name 通过元素名查找一个或多个元素

find_element_by_tag_name/find_elements_by_tag_name 通过html标记名查找一个或多个元素

find_element_by_class_name/find_elements_by_class_name 通过class name查找一个或多个元素

find_element_by_css_selector/find_elements_by_css_selector 通过css选择器查找一个或多个元素

三、js执行类

execute_script 同步模式执行js(等待js的执行完成,才进入下一步)

execute_async_script 异步模式执行js(不需要等待js的执行结果,直接进行下一步)

四、窗口、元素操作类

current_window_handle 获取当前窗口的handle

handlewindow_handles 获取当前webdriver session所有窗口的

maximize_window 最大化窗口

set_window_size 设置窗口大小

get_window_size 获取窗口大小

set_window_position 设置窗口位置

get_window_position 获取窗口位置

switch_to_window 切换至指定窗口

switch_to_default_content 切换至默认的frame

switch_to_frame 切换至指定的frame

switch_to_alert 切换至标准的alert窗口

switch_to_active_element 切换至当前激活的元素

五、基本信息读取类

desired_capabilities 获取当前会话的desired_capabilities信息

current_url 获取当前页面的url

page_source 获取当前页面的源码

title 获取当前页面的标题

六、其他

implicitly_wait

get_screenshot_as_file,截图保存。参数-文件名,绝对路径

save_screenshot

get_screenshot_as_png

get_screenshot_as_base64

3)from selenium import webdriver

  broeswerdriver = webdriver.Chrome() 实例化chrome的driver对象

  selenium/webdriver/__init.py中导入from .chrome.webdriver import WebDriver as Chrome

2、WebElement模块

1)driver.find_element_by_id('username').clear()

2)常用方法

tag_name,获取当前元素的标签名

text,获取元素的文本

click,单击

submit,提交表单,一般是form表单

clear,清空

get_property(name)

get_attribute(name),获取元素的属性

is_selected,元素是否选中,返回布尔

is_enabled,元素是否可编辑,返回bool类型

send_keys,输入

is_displayed,元素是否可见,返回bool类型

location_once_scrolled_into_view

size,返回元素的尺寸

location,获取元素的位置,譬如 left = element.location['x'] top = element.location['y']

rect,获取一个包含当前元素大小和位置的字典

parent,获取当前元素的父节点

3、expected_conditions模块

1)引入模块:from selenium.webdriver.support import expected_conditions as EC

2)title_is 判断页面title是否一致,若一致则返回true,不一致则返回false。

示例:title = EC.title_is(u'路由心定 - 简书')

      print title(browser)

3)title_contains 用与title_is差不多,只不过这个是只要包含指定字符就可以

4)presence_of_element_located,判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回元素

示例:elem = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "xpah路径")))

      print elem

5)url_contains,判断页面地址是否包含指定字符

6)url_matches,判断页面地址是否匹配

7)url_to_be,判断页面地址是否完全一致

8)url_changes,判断页面地址是否不完全不一致

9)visibility_of_element_located,判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0

10)visibility_of,判断某个元素是否在页面中可见

11)presence_of_all_elements_located,判断是否至少有1个元素存在于dom树中,如果定位到就返回列表

12)visibility_of_any_elements_located,判断是否至少有一个元素在页面中可见,如果定位到就返回列表

13)visibility_of_all_elements_located,判断所有元素是否在页面中可见,如果定位到就返回列表,否则返回false

14)text_to_be_present_in_element,判断指定的元素中是否包含了预期的字符串,返回布尔值

15)text_to_be_present_in_element_value,判断指定元素的value属性值中是否包含了预期的字符串,返回布尔值(注意:只是value属性)

16)frame_to_be_available_and_switch_to_it,判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False

17)invisibility_of_element_located,判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素

18)element_to_be_clickable,判断某个元素是否可见并且是可点击的,如果是的就返回这个元素,否则返回False

19)staleness_of,等待某个元素从dom树中移除

20)element_to_be_selected,判断某个元素是否被选中了,一般用在下拉列表

21)element_located_to_be_selected,判断某个元素对否被选中了

22)element_selection_state_to_be,判断某个元素的选中状态是否符合预期

23)element_located_selection_state_to_be,判断某个元素的选中状态是否符合预期

24)number_of_windows_to_be 判断窗口数量是否等于指定值

25)new_window_is_opened 判断新窗口是否打开

26)alert_is_present,判断页面上是否存在alert,如果有就切换到alert并返回alert的内容

4、select模块,用于处理标准select下拉框

1)引入模块:from selenium.webdriver.support.ui import Select

虽然Select类代码位于selenium/webdriver/support/select.py,但是由于ui.py文件中直接导入了Select,因此可以使用此引入方式

2)options,以列表形式返回下拉框的所有选项

3)all_selected_options,以列表形式返回下拉框所有被选中项

4)first_selected_option,返回下拉框被选中项的第一个

5)select_by_value,通过索引定位,索引值从0开始

6)select_by_index,通过value值定位

7)select_by_visible_text,通过文本值定位

示例:Select(driver.find_element_by_name("storeDeclare.cityLine")).select_by_visible_text("3线")

8)deselect_all,取消全部的已选择项

9)deselect_by_value,取消已选中的value值项

10)deselect_by_index,取消已选中的索引项

11)deselect_by_visible_text,取消已选中的文本值项

5、wait模块

1)引入模块:from selenium.webdriver.support.ui import WebDriverWait

虽然Select类代码位于selenium/webdriver/support/wait.py,但是由于ui.py文件中直接导入了WebDriverWait,因此可以使用此引入

方式。

2)util

2.1)示例:WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("某个按钮")).click() 在10秒内等待某个按钮被

定位到再去点击。就是每隔0.5秒内调用一下until里面的表达式或者方法函数,要么10秒内表达式执行成功,要么10秒后抛出超时异常。

2.2)结合expected_conditions模块使用:WebDriverWait(driver,10).until(EC.alert_is_present()).accept() 10秒钟等待浏览器弹

出的对话框,如果出现,就点击确定按钮

3)until_not,基本用法同util一致

5、EventFiringWebDriver模块,监听器

1)引入模块:from selenium.webdriver.support.events import EventFiringWebDriver

1.1)虽然Select类代码位于selenium/webdriver/support/event_firing_webdriver.py,但是由于ui.py文件中直接导入了

EventFiringWebDriver,因此可以使用此引入方式。

1.2)EventFiringWebDriver其实也是一个WebDriver。可以实现在使用WebDriver同样的操作。

1.3)使用EventFiringWebDriver的优势在于可以用监听器监听他的所有操作。

1.4)实例化方式

普通创建:WebDriver driver = new FirefoxDriver();

监听器创建:WebDriver driver = new EventFiringWebDriver(new FirefoxDriver()).register(new LogEventListener());

其中LogEventListener()是自定义的监听器,名字可以随意取,监听器需要继承WebEventListener接口,并实现接口中的方法

2)wrapped_driver

get(url)

back

forward

execute_script

execute_async_script

close

quit

find_element

find_elements

find_element_by_id

find_element_by_xpath

find_elements_by_xpath

find_element_by_link_text

find_elements_by_link_text

find_element_by_partial_link_text

find_elements_by_partial_link_text

find_element_by_name

find_elements_by_name

find_element_by_tag_name

find_elements_by_tag_name

find_element_by_class_name

find_elements_by_class_name

find_element_by_css_selector

find_elements_by_css_selector

6、Keys模块,主要是定义了一些特殊的按键

from selenium.webdriver.common.keys import Keys

elem.send_keys(Keys.RETURN)

elem.send_keys(Keys.CONTROL, 'a')

7、TouchActions 模拟移动端触摸操作

1)引入from selenium.webdriver.common.touch_actions import TouchActions

2)示例:Action = TouchActions(driver)

Action.flick_element(button, 0, 200, 50).perform()

3)常用方法

perform(),执行链中的所有动作

tap(元素),单击

double_tap(元素),双击

tap_and_hold(x坐标,y坐标),某点按住

move(x坐标,y坐标),移动到指定的位置

release(x坐标,y坐标),在某个位置松开操作

scroll(x轴偏移量, y轴偏移量),滚动到某个位置

scroll_from_element(操作元素定位, x轴偏移量, y轴偏移量),以元素为起点向下滑动,实现下拉操作。注意:向下滑动为负数,

向上滑动为正数。

long_press(元素),长按不释放

flick(xspeed, yspeed),轻弹,从屏幕上的任何位置开始

flick_element(操作元素定位, x轴偏移量, y轴偏移量, 速度),以元素为起点以一定速度向下滑动,实现下拉操作。注意:向上滑动

为负数,向下滑动为正数。

8、Alert模块,处理弹窗

1)弹窗种类:

1.1)警告消息框(alert):警告消息框提供了一个"确定"按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说用户必须先

关闭该消息框然后才能继续进行操作。

1.2).确认消息框(confirm):确认消息框向用户提示一个"是与否"问题,用户可以根据选择"确定"按钮和"取消"按钮。

1.3).提示消息对话(prompt):提示消息框提供了一个文本字段,用户可以在此字段输入一个答案来响应您的提示。该消息框有一个

"确定"按钮和一个"取消"按钮。选择"确认"会响应对应的提示信息,选择"取消"会关闭对话框。

2)引入:

alert = driver.switch_to_alert()

print (alert.text)

3)示例:

4)常用方法

switch_to_alert()   #定位弹出对话

text #获取对话框文本值

dismiss #相当于点击"取消"

accept #相当于点击"确认"

send_keys # 输入值,这个alert和confirm没有输入对话框,所以这里就不能用了,所以这里只能使用在prompt这里。

9、ActionChains模块,模拟鼠标的行为

1)引入:from selenium.webdriver.common.action_chains import ActionChains

2)示例:

source = browser.find_element_by_css_selector('#draggable')      # 被拖拽的对象

target = browser.find_element_by_css_selector('#droppable')      # 目标对象

actions = ActionChains(browser)

actions.drag_and_drop(source, target)

actions.perform()

3)常用方法

perform 执行链中的所有动作

reset_actions 释放所有操作

click 鼠标单击

click_and_hold 鼠标单击且按住不放

context_click 右击

double_click 双击

drag_and_drop(source, target) 拖拽

drag_and_drop_by_offset(source, xoffset, yoffset) 拖拽到指定位置

key_down 按住某个键,按下Ctrl+c键:ActionsChains(browser).key_down(Keys.CONTROL).send_keys('c').perform()

key_up 松开某个键,实现按下Ctrl+c并且释放: ActionsChains(browser).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

move_by_offset(xoffset, yoffset)  指定鼠标移动到某一个位置

move_to_element(to_element)  移动鼠标到某个元素位置的偏移位置

move_to_element_with_offset

pause 等待

release 释放按下的鼠标

send_keys(*keys_to_send)  向某个元素位置输入值

send_keys_to_element(element, *keys_to_send) 向指定的元素输入数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容