selenium(Python)(Linux系统下运行程序代码)

Python相关:(Ubuntu下)

chrome selenium驱动器:

http://chromedriver.storage.googleapis.com/index.html

selenium的部分命令更新:

https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.quit

1.下载selenium server(该服务需要运行在Java环境下,需要安装jdk)

下载的是一个jar包,放在Java安装路径的lib文件夹下。

2.安装Python相关的依赖 pip install selenium

3.使用Firefox浏览器时,在Ubuntu下需要下载 geckodriverckod https://github.com/mozilla/geckodriver/releases
解压放到/usr/local/bin 目录下。

webdriver支持的浏览器:

webdriver.Firefox
webdriver.FirefoxProfile
webdriver.Chrome
webdriver.ChromeOptions
webdriver.Ie
webdriver.Opera
webdriver.PhantomJS
webdriver.Remote
webdriver.DesiredCapabilities
webdriver.ActionChains
webdriver.TouchActions
webdriver.Proxy

from selenium import webdriver

driver = webdriver.Firefox()


元素定位:

1.可以通过这几种方法来查找元素 返回单个元素
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
element = driver.find_element_by_link_text(“百度链接”)
element = driver.find_element_by_partial_link_text(“百度”)类似模糊查询,输入链接text的一部分
element = driver.find_element_by_tag_name(‘h1’)返回第一个h1标签
element = driver.find_element_by_class_name(‘content’)返回类名为content的标签
element = driver.find_element_by_css_selector('p.content')返回如下的第一个p 标签
<p class="content">Site content goes here.</p>
这个类似css的选择器

2.返回元素列表:
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

find_element_by_ 会返回第一个符合条件的元素,当找不到元素时会报NoSuchElementException异常

当没有ID和name属性时,使用xpath
当知道<a>text</a>标签的text时 使用linkText


selenium提供两种方法定位元素:还有如下一种方法 这种方法效率更高,但是第一种更符合使用习惯
from selenium.webdriver.common.by import By

通过By类
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')
driver.find_elements(By.ID,“hshg-id”)
其他属性同第一种方法,都换成大写

 

Keys包用来模拟键盘操作

from selenium.webdriver.common.keys import Keys

对于Keys 类下有哪些属性,可以在ipython中查看(已安装selenium)

下拉页面(相当于滑动下拉框到底部)
elem.send_keys(Keys.PageDown)

Keys.BACK_SPACE 删除键

Keys.SPACE 空格键

Keys.ENTER 回车键

send_keys(Keys.CONTROL,'a') 全选
send_keys(Keys.CONTROL,'c') 复制
send_keys(Keys.CONTROL,'x') 剪切
send_keys(Keys.CONTROL,'v') 粘贴

elem.send_keys("python")
elem.send_keys(Keys.RETURN) 类似鼠标点击进入
上面两句可以合写一句elem.send_keys("123",Keys.RETURN)

窗体相关方法:

导航网页 位置

driver.get("http://www.example.com") 进入某一网页

driver.forward() 前进

driver.back() 后退

execute_script(script*args)  在当前窗口执行js 代码 (js代码自己写)

driver.execute_script("window.scrollTo(arguments[0], arguments[1]);",50,500) 传参使用内部的arguments列表

driver.create_web_element(element_id)  使用指定的元素id创建一个web元素

driver.fullscreen_window()   调用窗口管理器特定的“全屏”操作

driver.page_source 整个页面的HTML代码 当前打开的页面

driver.title 网页的标题<title>标签中的文字

get_screenshot_as_base64()

获取当前窗口的屏幕截图,作为base64编码的字符串
这对于嵌入在HTML中的嵌入图像很有用

get_screenshot_as_file(filename) save_screenshot(filename) 两方法等同
driver.get_screenshot_as_file(‘/Screenshots/foo.png’)
将当前窗口的屏幕截图保存到PNG图像文件中。返回
如果有任何的IOError,则返回True。在文件名中使用完整路径。

get_screenshot_as_png()
将当前窗口的屏幕截图作为二进制数据。

get_window_position(windowHandle='current')
得到当前窗口x y 的位置

driver.get_window_position() 默认可以不写

get_window_rect()
得到窗口的x,y坐标,以及当前窗口的高度和宽度。

get_window_size(windowHandle='current')
得到当前窗口的高度和宽度

implicitly_wait(time_to_wait)
设置一个隐式的等待超时,当元素找到就往下执行,否则超过时间就报异常

driver.implicitly_wait(30) second

quit()
退出驱动程序并关闭所有相关的窗口

close()
关闭当前窗口

refresh()
刷新当前网页.

minimize_window()
调用窗口管理器特定的“最小化”操作

maximize_window()
最大化当前使用窗口

set_page_load_timeout(time_to_wait)
设置等待页面加载完成所需的时间 超时抛异常

set_script_timeout(time_to_wait)
设置脚本在一个时间内等待的时间,在抛出错误之前执行executeasyncscript调用

driver.current_url 正在加载页面的URL(driver相当于窗口)

current_window_handle
返回当前窗口的句柄

driver.name 返回低层调用浏览器名字

window_handles
在当前会话中返回所有窗口的句柄。

元素相关操作:

elem = driver.find_element_by_id("btn_id")

clear()
elem.clear()
如果是文本输入元素,就清除文本

click()
点击元素

send_keys(*value)
模拟输入元素 使用此方法发送简单的关键事件或填写表单字段

submit()
提交表单


get_attribute(name)
获得元素的属性,不存在时返回None
elem.get_attribute("class")

get_property(name)
获得元素的属性
elem.get_property("text_length")


value_of_css_property(property_name)
获取CSS属性

text
返回元素的文本

is_displayed()
判断该元素是否对用户可见


is_enabled()
判断是否使用了该元素

is_selected()
判断元素是否被选择,用于选框

screenshot(filename)
将当前元素的屏幕截图保存到PNG图像文件中。返回
如果有任何的IOError,则返回True。在文件名中使用完整路径
element.screenshot(‘/Screenshots/foo.png’)

id
elem.id 获取的不是属性ID, 是存储位置


location_once_scrolled_into_view
这种性质可能在没有任何警告的情况下发生变化。使用这个来发现屏幕上的元素是什么,
这样我们就可以点击它了。这个方法应该使元素被滚动到视图中。

rect
返回元素大小和位置的字典

 

弹出框:

from selenium.webdriver.common.alert import Alert

创建alert对象:alert = Alert(driver)
或者alert = driver.switch_to_alert()   不推荐使用这种方法

Alert(driver).accept() 同意


常用方法:直接用对象调用以下方法
accept() 同意弹出框

authenticate(username, password)
将用户名/密码发送到经过身份验证的对话框(如基本的HTTP身份验证)。隐式地“单击ok”

driver.switch_to.alert.authenticate(‘cheese’, ‘secretGouda’)

dismiss()
不同意

send_keys(keysToSend)
向弹出框发送text

text属性 获取弹出框的文本
alert_text = Alert(driver).text

Cookies:

设置cookie
# Now set the cookie. This one's valid for the entire domain
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)
获取cookie
# And now output all the available cookies for the current URL
driver.get_cookies()  获取所有的cookie

get_cookie(name)   根据cookie名获取指定的cookie

delete_all_cookies()     删除所有的cookie

delete_cookie(name)   根据cookie名删除指定的cookie

 

设置等待页面加载时间:
通过time模板设置sleep时间,不能确定是否加载
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()

在抛出TimeoutException之前,它等待10秒,除非它在10秒内找到返回的元素。


常用的场景:selenium中提供的场景

title_is
title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present

wait = WebDriverWait(driver, 10) 固定等待时间
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))


隐式等待告诉WebDriver在尝试查找任何元素(或元素)不立即可用时,在一定的时间内对DOM进行轮询。
默认设置为0。一旦设置好了,就为WebDriver对象的生命设置了隐式等待

driver.implicitly_wait(10) # seconds
当前页面任何元素不可用,都等待。等待时间不确定,并不是等待设置时间,当查询的元素可用,程序既向下走

myDynamicElement = driver.find_element_by_id("myDynamicElement")

 

动作链相关对鼠标的操作:
from selenium.webdriver.common.action_chains import ActionChains

actions = ActionChains(driver)
actions.move_to_element(menu) 鼠标移动到元素
actions.click(hidden_submenu) 鼠标点击(点击前可以不需要移动到元素)
actions.perform() 执行以上操作  使用动作链操作最后都必须选择执行才生效

ActionChains(driver).move_to_element(elem).click(elem).perform()上面三句可以连着写

常见操作:
click(on_element=None)
如果元素存在,点击元素。如果不存在点击鼠标当前位置

click_and_hold(on_element=None)
在一个元素上按下鼠标左键。素。如果不存在在鼠标当前位置点击鼠标右键

context_click(on_element=None)
在元素上执行上下文单击(右键单击)

double_click(on_element=None)
双击一个元素

drag_and_drop(source, target) 拖拽一个元素到另一个位置
在源元素上保留鼠标左键,
然后移动到目标元素并释放鼠标按钮

drag_and_drop_by_offset(source, xoffset, yoffset)
在源元素上保留鼠标左键,
然后移动到目标偏移量并释放鼠标按钮

key_down(value, element=None)
只发送一个键盘按键,而不释放它。仅被用于修饰符键(Ctrl、Alt和Shift键 enter等)。

value来源于键盘 通过Key类来发送
element存在时,通过元素send keys,不存在发送keys到焦点元素

key_up(value, element=None)
释放一个修饰符的键

这两个一起用如按 ctrl+c
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

ActionChains(driver).key_down(Keys.ENTER).key_up(Keys.ENTER).perform() 通过鼠标输入enter键

move_by_offset(xoffset, yoffset)
根据当前鼠标位置偏移

move_to_element(to_element)
移动鼠标到元素上

move_to_element_with_offset(to_element, xoffset, yoffset)
将鼠标移动到指定元素的偏移量。
偏移量是相对于元素的左上角的


pause(seconds)
暂停

perform()
执行所有存储操作

release(on_element=None)
在元素上释放一个鼠标按钮

reset_actions()
清除已经存储在远程终端上的操作

send_keys(*keys_to_send)
将键发送到当前焦点元素
参数使用Key类中的属性

send_keys_to_element(element, *keys_to_send)
像元素发送键

UI支持:
from selenium.webdriver.support.select import Select

只作用select标签
select = Select(select_element)

deselect_all()
清除所有选中的条目 取消勾选

deselect_by_index(index)
通过索引清除

deselect_by_value(value)
通过option的value来清除
<option value=”foo”>Bar</option>

deselect_by_visible_text(text)
<option value=”foo”>Bar</option>
通过text来取消勾选

select_by_index(index)
通过索引选择

select_by_value(value)

select_by_visible_text(text)

all_selected_options
返回所有选中的option列表

first_selected_option
返回第一个被选中的option

options
返回select下所有的option标签列表

期待事件 多用在assert中:
import selenium.webdriver.support.expected_conditions

selenium.webdriver.support.expected_conditions.element_to_be_clickable(locator)
判断页面是否有元素可点击
locator is a tuple of (by, path)

selenium.webdriver.support.expected_conditions.element_to_be_selected(element)
判断元素是否被选择

selenium.webdriver.support.expected_conditions.alert_is_present
期待弹出框出现


selenium.webdriver.support.expected_conditions.title_contains(title)
判断标题包括

selenium.webdriver.support.expected_conditions.url_changes(url)
判断URL改变

selenium.webdriver.support.expected_conditions.url_matches(pattern)
判断URL是否匹配 pattern期待的URL 和当前URL对比

 

posted on 2017-12-07 11:59  yanmay  阅读(636)  评论(0编辑  收藏  举报

导航