Python相关:(Ubuntu下)
参考http://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.FirefoxProfilewebdriver.Chromewebdriver.ChromeOptionswebdriver.Iewebdriver.Operawebdriver.PhantomJSwebdriver.Remotewebdriver.DesiredCapabilitieswebdriver.ActionChainswebdriver.TouchActionswebdriver.Proxyfrom 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_namefind_elements_by_xpathfind_elements_by_link_textfind_elements_by_partial_link_textfind_elements_by_tag_namefind_elements_by_class_namefind_elements_by_css_selectorfind_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)获得元素的属性,不存在时返回Noneelem.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)
向弹出框发送texttext属性 获取弹出框的文本
alert_text = Alert(driver).textCookies:
设置cookie
# Now set the cookie. This one's valid for the entire domaincookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}driver.add_cookie(cookie)获取cookie# And now output all the available cookies for the current URLdriver.get_cookies() 获取所有的cookieget_cookie
(name) 根据cookie名获取指定的cookie
delete_all_cookies() 删除所有的cookie
delete_cookie(name) 根据cookie名删除指定的cookie
设置等待页面加载时间:
通过time模板设置sleep时间,不能确定是否加载from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECtry:
element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) )finally: driver.quit()在抛出TimeoutException之前,它等待10秒,除非它在10秒内找到返回的元素。
常用的场景:selenium中提供的场景title_is
title_containspresence_of_element_locatedvisibility_of_element_locatedvisibility_ofpresence_of_all_elements_locatedtext_to_be_present_in_elementtext_to_be_present_in_element_valueframe_to_be_available_and_switch_to_itinvisibility_of_element_locatedelement_to_be_clickablestaleness_ofelement_to_be_selectedelement_located_to_be_selectedelement_selection_state_to_beelement_located_selection_state_to_bealert_is_presentwait = 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 ActionChainsactions = 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
返回第一个被选中的optionoptions
返回select下所有的option标签列表期待事件 多用在assert中:
import selenium.webdriver.support.expected_conditionsselenium.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对比