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对比