selenium用法
selenium 是一个用于Web应用程序测试的工具。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
selenium用于爬虫,主要是用来解决javascript渲染的问题。
1. 声明浏览器对象
from selenium import webdriver #声明谷歌、Firefox等浏览器 browser=webdriver.Chrome() browser=webdriver.Firefox() browser=webdriver.Safari() browser=webdriver.Edge() browser=webdriver.PhantomJS()
2. 访问页面
from selenium import webdriver browser=webdriver.Chrome() browser.get("http://www.baidu.com") print(browser.page_source) browser.close()
3. 操作浏览器的方法
from selenium import webdriver driver = webdriver.Chorm() firset_url = 'www.baidu.com' driver.get(url=url) second_url = 'www.taobao.com' driver.get(url=url) # 后退到百度 driver.back() # 前进到淘宝 driver.forward # 刷新页面 driver.refresh() # 窗口截图 driver.save_screenshot('1.png') driver.get_screenshot_as_file('2.png') # 设置窗口 driver.get_window_size() # 获取当前窗口大小 driver.set_window_size(1366, 768) # 设置窗口大小
driver.title # 获取当前页面的标题 driver.page_source # 获取当前页面 driver.current_url # 获取当前的url driver.text # 获取搜索条目的文本信息
4. 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种。
注意:
selenium-webdriver通过findElement()\findElements()等find方法调用"By"对象来定位和查询元素。By类只是提供查询的方式进行分类。findElement返回一个元素对象否则抛出异常,findElements返回符合条件的元素 List,如果不存在符合条件的就返回一个空的list。
1 from selenium import webdriver 2 from selenium.webdriver.common.by import By 3 driver = webdriver.Chorm() 4 ele_name = driver.findElement(By.NAME, 'name')) # 按照name值来查询 5 ele_id = driver.findElement(By.ID, 'id') # 按照ID值来查询 6 ele_tagName = driver.findElement(By.TAG_NAME, 'tagName') # 按照tagName值来查询 7 ele_className = driver.findElement(By.CLASS_NAME, 'className') # 按照className值来查询 8 ele_xpath = driver.findElement(By.XPATH, 'xpath') # 按照xpath表示式查询 9 ele_cssSelector = driver.findElement(By.CSS_SELECTOR, 'cssSelector') # 按照css查询 10 ele_linkText = driver.findElement(By.LINK_TEXT, 'linkText') # 按照文本信息查询 11 ele_partialLinkText = driver.findElement(By.LINK_TEXT, 'partialLinkText ') # linkText的拓展方法,可以通过部分文字进行匹配
5. 元素的交互操作
import time from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome(executable_path=r"D:\driver-chrome\chromedriver.exe") driver.get('https://www.baidu.com') input = driver.find_element_by_id('kw') input.send_keys('selenium') button = driver.find_element_by_id('su') button.click() time.sleep(2) input.clear() input.send_keys('webdriver') button.click() driver.quit()
1 input.send_keys('selenium') # input框中输入内容 2 input.send_keys(key.SPACE) # input框中输入空格 3 input.send_keys(Keys.BACK_SPACE) # 删除内容 4 input.send_keys(Keys.CONTROL, 'a') # 全选输入框中的内容 5 input.send_keys(Keys.CONTROL, 'x') # 剪切输入框中的内容 6 input.send_keys(Keys.CONTROL, 'v') # 粘贴内容到输入框中 7 input.send_keys(Keys.ENTER) # 回车键代替单击操作 8 input.send_keys(Keys.ESCAPE) # 回退操作 9 参考链接:http://www.testclass.net/selenium_python/keyword-event/
6. 点击事件
在webDriver中,将这些关于鼠标操作的方法封装在ActionChains类中。
1 perform():执行所有ActionChains中存储的行为 2 context_click():右击 3 double_click():双击 4 drag_and_drop():拖动 5 move_to_element():鼠标悬停
from selenium import webdriver # 引入 ActionChains 类 from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://www.baidu.cn") # 定位到要悬停的元素 set = driver.find_element_by_link_text("设置") # 调用 ActionChains()类, 将浏览器驱动 driver 作为参数传入,对定位到的元素执行鼠标悬停操作 ActionChains(driver).move_to_element(set).perform()
7. 设置元素等待
webDriver提供了俩种类型的等待:显示等待和隐式等待
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。 WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下: WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) driver :浏览器驱动 timeout : 最长超时时间,默认以秒为单位 poll_frequency : 检测的间隔(步长)时间,默认为0.5S ignored_exceptions : 超时后的异常信息默认情况下抛NoSuchElementException异常 WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。 until(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。 until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait # 通常使用expected_conditions方法判断元素是否加载 from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://www.baidu.com") element = WebDriverWait(driver, 3, 0.5).until( EC.presence_of_element_located((By.ID, "kw")) ) element.send_keys('selenium') driver.quit()
webdriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。
implicitly_wait() 默认参数的单位为秒,如设置等待时长为5秒。首先这5秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第4秒定位到了元素则继续执行,若直到超出设置时长(5秒)还没有定位到元素,则抛出异常。
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException driver = webdriver.Chrome() # 设置隐式等待为5秒 driver.implicitly_wait(5) driver.get("http://www.baidu.com") try: driver.find_element_by_id("kw22").send_keys('selenium') except NoSuchElementException as e: print(e) finally: driver.quit()
8. 多窗口切换
webdriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。
driver.current_window_handle # 获得当前窗口句柄 driver.window_handles # 获得当前所有打开的窗口的句柄 driver.switch_to.window() # 用于不同窗口的切换
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get("http://www.baidu.com") # 获得当前窗口句柄 current_windows = driver.current_window_handle driver.find_element_by_link_text('登录').click() driver.find_element_by_link_text("立即注册").click() # 获得当前所有打开的窗口的句柄 all_handles = driver.window_handles # 进入注册窗口 for handle in all_handles: if handle != current_windows: driver.switch_to.window(handle) print('这是注册页窗口') driver.find_element_by_name("account").send_keys('username') driver.find_element_by_name('password').send_keys('password')
9. 下拉框选择操作
webdriver提供了Select类来处理下拉框。
from selenium.webdriver.support.select import Select Select类用于定位select标签。 select_by_value() 方法用于定位下接选项中的value值。
from selenium import webdriver from selenium.webdriver.support.select import Select driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('http://www.baidu.com') # 鼠标悬停至“设置”链接 driver.find_element_by_link_text('设置').click() # 打开搜索设置 driver.find_element_by_link_text("搜索设置").click() # 搜索结果显示条数 sel = driver.find_element_by_xpath("//select[@id='nr']") Select(sel).select_by_value('50') # 显示50条 driver.quit()
10. Cookie操作
WebDriver操作cookie的方法:
get_cookies(): 获得所有cookie信息。
get_cookie(name): 返回字典的key为“name”的cookie信息。
add_cookie(cookie_dict) : 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值。
delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”。
delete_all_cookies(): 删除所有cookie信息。
11. 调用js代码
js = "window.scrollTo(100,450);" driver.execute_script(js)