selenium菜鸟教程 Selenium 使用手册


一、安装及环境配置如果要使用selenium,需要下载chrome及对应系统、对应浏览器版本的chromedriver 。
pip安装:pip install selenium

二、基本使用【selenium菜鸟教程 Selenium 使用手册】
2.1 启动及配置# 普通启动from selenium import webdriver# 1. 实例化一个浏览器browser = webdriver.Chrome("./chromedriver")# 参数为驱动路径browser.get("http://www.baidu.com/")# 驱动浏览器访问百度browser.page_source# 获取当前浏览器的htmlbrowser.quit()# 退出实例化的浏览器# 包含配置信息启动from selenium import webdriver# 配置options = webdriver.ChromeOptions()options.add_argument('--headless')# 增加无界面选项options.add_argument('--disable-gpu')# 如果不加这个选项,有时定位会出现问题options.add_argument('--user-data-dir=/Users/mac/Library/Application Support/Google/Chrome/Default')# 设置成用户自己的数据目录# 实例化一个浏览器对象,并加载配置browser = webdriver.Chrome(executable_path="./chromedriver", options=options)browser.get("http://www.baidu.com/")# 驱动浏览器访问百度browser.page_source# 获取当前浏览器的htmlbrowser.quit()# 退出实例化的浏览器
2.2 基本浏览器动作# 定位browser.find_element_by_id("id")# 通过id定位browser.find_element_by_name("name")# 通过name定位browser.find_element_by_class_name("class_name")# 通过classname定位browser.find_element_by_tag_name("input")# 通过tag标签定位browser.find_element_by_xpath("//input[@id='kw']")# 通过xpath定位browser.find_element_by_css_selector("#kw")# 通过CSS方式定位# 等待# 1.强制等待x秒time.sleep(10)# 强制程序休眠10s# 2.每次都等到浏览器全部加载完成browser.implicitly_wait(30)# 隐式等待,参数为最长等待时间(s) 。页面全部加载完成才会执行下一步操作 。# 需要注意的是,browser.implicitly_wait(30)是为全局设置最长30s的等待时间 。# 3.等到自己需要的元素出现或者自己不需要的元素消失from selenium.webdriver.support.wait import WebDriverWaitWebDriverWait(browser, 30).until(EC.title_is("百度一下,你就知道"))# 等待,直到标题是百度一下,或超时WebDriverWait(browser, 30).until(EC.title_contains("百度"))# 等待,直到标题包含百度,或超时WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.ID, "id")))# 等待,直到Dom中存在该idWebDriverWait(browser, 30).until(EC.visibility_of_element_located((By.ID, "id")))# 等待,直到Dom中存在该id并且可见WebDriverWait(browser, 30).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]")))# 等待,直到该元素是可点击的WebDriverWait(browser, 30).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'.main'),'enable'))# 判断.main中是否包含enable字符串,返回布尔值WebDriverWait(browser, 30).until(EC.staleness_of(driver.find_element(By.ID,'id')))# 等待,直到id从dom中移除# 行为browser.maximize_window()# 浏览器最大化browser.minimize_window()# 浏览器最小化browser.set_window_size(480, 800)# 自定义浏览器窗口大小browser.forword()# 浏览器前进browser.back()# 浏览器后退browser.close()# 关闭浏览器当前窗口browser.quit()# 退出浏览器驱动并关闭所有窗口browser.refresh()# 刷新当前页browser.page_source# 获取当前页htmlbrowser.title# 获取当前页标题browser.url# 获取当前页urlbrowser.find_element_by_name("name").click()# 点击对象browser.find_element_by_name("name").send_keys("keyword")# 模拟键盘输入browser.find_element_by_name("name").clear()# 清除对象的内容browser.find_element_by_name("name").submit()# 提交对象的内容browser.find_element_by_name("name").text()# 获取元素的文本信息browser.find_element_by_name("name").context_click()# 右键单击browser.find_element_by_name("name").double_click()# 双击browser.find_element_by_name("name").is_displayed()# 是否用户可见# 模拟键盘事件from selenium.webdriver.common.keys import Keysbrowser.find_element_by_id("user_pwd").send_keys(Keys.ENTER)# 通过定位密码框,enter(回车)来代替登陆按钮browser.find_element_by_id("login").send_keys(Keys.ENTER)# 点击回车登陆(替代click),和上面效果一样browser.find_element_by_name("name").send_keys(Keys.CONTROL, "a")# 模拟ctrl+a# iframebrowser.switch_to_frame("f1")# 找到 f1 iframebrowser.switch_to_window("f1")# 找到内嵌窗口 f1driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
三、其他使用# 操作cookiebrowser.get_cookie("name")# 根据name获取单个cookiebrowser.get_cookies()# 获取所有cookiebrowser.delete_all_cookies()# 删除所有cookiesbrowser.delete_cookie("name")# 根据name删除对应cookiebrowser.add_cookie({"k1": "v1", "k2": "v2"})# 设置cookies# 获取截屏browser.get_screenshot_as_file("/usr/download/down_image.png")# 保存当前窗口截图browser.get_screenshot_as_png()# 获取当前png截图的二进制字符串# 获取窗口信息browser.get_window_rect()# 获取当前窗口xy坐标及当前窗口的高度和宽度browser.get_window_position(windowHandle="current")# 获取当前窗口的x,y坐标browser.get_window_size(windowHandle="current")# 获取当前窗口的高度和宽度# 多窗口切换driver.get("http://example.com")# 打开一个窗口now_handle = drvier.current_window_handle# 获取当前窗口句柄driver.find_element_by_name('example').click()# 点击某个元素打开新的窗口(target="_black"的元素)all_handle = drvier.window_handles# 获取所有窗口句柄drvier.switch_to.window(now_handle)# 切换为第一窗口driver.close()# 关闭当前窗口# 通过input上传附件self.browser.find_element_by_xpath('//input[@class="file-selector-file"]').send_keys("/Users/mac/Documents/myspider/selenium_spider/test.mp4")# 必须要用绝对路径
3.1 切换标签页每个标签页都有对应的窗口句柄,可以通过窗口句柄切换到对应的标签页 。
# 1. 获取当前所有的标签页的句柄构成的列表current_windows = driver.window_handles # 2. 根据标签页句柄列表索引下标进行切换driver.switch_to.window(current_windows[0])
3.2 切换iframeselenium操作iframe内容需要先switch_to到iframe,操作完成后需要切换回来
login_frame = driver.find_element_by_id('login_frame') # 根据id定位 frame元素driver.switch_to.frame(login_frame) # 转向到该frame中# 利用切换标签页的方式切出frame标签windows = driver.window_handlesdriver.switch_to.window(windows[0])
3.3 cookie操作# 获取cookiecookies_dict = {cookie["name"]: cookie["value"] for cookie in driver.get_cookies()}# 删除一个cookiedriver.delete_cookie("CookieName")# 删除所有cookiedriver.delete_all_cookies()# 添加一个cookieadd_cookie(cookie_dict)
3.4 执行JS代码script = 'window.scrollTo(0,document.body.scrollHeight)'browser.execute_async_script(script, *args)# 在当前的window/frame中异步执行JS代码browser.execute_script(script, *args)# 在当前的window/frame中同步执行JS代码script: JS代码(str)*args: 要传入js的参数(iterable)
3.5 上传文件通过input上传文件
self.browser.find_element_by_xpath('//input[@class="file-selector-file"]').send_keys("/Users/mac/Documents/myspider/selenium_spider/test.mp4")# 必须要用绝对路径
3.6 截图browser.get_screenshot_as_file("/usr/download/down_image.png")# 保存当前窗口截图browser.get_screenshot_as_png()# 获取当前png截图的二进制字符串
3.7 鼠标事件from selenium.webdriver.common.action_chains import ActionChains el = driver.find_element_by_name('tj_trnews')# 目标元素ActionChains(driver).context_click(el).perform()# 右击目标元素ActionChains(driver).double_click(el).perform()# 双击目标元素source = driver.find_element_by_id('lg')# 目标元素原始位置target = driver.find_element_by_id('kw')# 拖动的目标位置ActionChains(driver).drag_and_drop(source, target).perform()# 拖动元素ActionChains(driver).move_to_element(el).perform()# 鼠标移动的目标元素上ActionChains(driver).click_and_hold(el).perform()# 移动到目标元素按下鼠标左键
3.8 控制已打开的浏览器.\chrome.exe --remote-debugging-port=6001 --user-data-dir="C:\ProgramFiles\Chrome"def init_driver():options = webdriver.ChromeOptions()options.add_experimental_option("debuggerAddress", "127.0.0.1:6001")driver = webdriver.Chrome(options=options)return driver
四、代码示例
4.1 初始化driver#!/usr/bin/env python# coding:utf-8import timefrom selenium import webdriverfrom selenium.webdriver.support.select import Selectdef chromedriver_demo():driver = webdriver.Chrome()driver.delete_all_cookies()driver.add_cookie({'name': 'ABC', 'value': 'DEF'})driver.get_cookies()driver.execute_script('window.open("https://www.baidu.com");')"""// chrome地址栏命令about:version - 显示当前版本about:memory - 显示本机浏览器内存使用状况about:plugins - 显示已安装插件about:histograms - 显示历史记录about:dns - 显示DNS状态about:cache - 显示缓存页面about:gpu -是否有硬件加速about:flags -开启一些插件chrome://extensions/ - 查看已经安装的扩展// chrome参数–user-data-dir=”[PATH]” 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区 。–disk-cache-dir=”[PATH]“ 指定缓存Cache路径–disk-cache-size= 指定Cache大小,单位Byte–first run 重置到初始状态,第一次运行–incognito 隐身模式启动–disable-javascript 禁用Javascript–omnibox-popup-count=”num” 将地址栏弹出的提示菜单数量改为num个 。我都改为15个了 。–user-agent=”xxxxxxxx” 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果–disable-plugins 禁止加载所有插件,可以增加速度 。可以通过about:plugins页面查看效果–disable-javascript 禁用JavaScript,如果觉得速度慢在加上这个–disable-java 禁用java–start-maximized 启动就最大化–no-sandbox 取消沙盒模式–single-process 单进程运行–process-per-tab 每个标签使用单独进程–process-per-site 每个站点使用单独进程–in-process-plugins 插件不启用单独进程–disable-popup-blocking 禁用弹出拦截–disable-plugins 禁用插件–disable-images 禁用图像–incognito 启动进入隐身模式–enable-udd-profiles 启用账户切换菜单–proxy-pac-url 使用pac代理 [via 1/2]–lang=zh-CN 设置语言为简体中文–disk-cache-dir 自定义缓存目录–disk-cache-size 自定义缓存最大值(单位byte)–media-cache-size 自定义多媒体缓存最大值(单位byte)–bookmark-menu 在工具 栏增加一个书签按钮–enable-sync 启用书签同步–single-process 单进程运行Google Chrome–start-maximized 启动Google Chrome就最大化–disable-java 禁止Java–no-sandbox 非沙盒模式运行"""def init_driver(driver_path: str, timeout=20, user_agent: str = None, headless=False,proxy: str = None, binary_location: str = None, user_data_dir: str = None,crx_dir=None):chrome_options = webdriver.ChromeOptions()chrome_options.add_argument("blink-settings=imagesEnabled=false")# 设置图片不加载chrome_options.add_argument("--disable-gpu")chrome_options.add_argument("disable-infobars")# 隐藏"Chrome正在受到自动软件的控制"chrome_options.add_argument("lang=zh_CN.UTF-8")# 设置中文chrome_options.add_argument("window-size=1920x3000")# 指定浏览器分辨率chrome_options.add_argument("--hide-scrollbars")# 隐藏滚动条, 应对一些特殊页面chrome_options.add_argument("--remote-debugging-port=9222")# chrome_options.binary_location = r"/Applications/Chrome"# 手动指定使用的浏览器位置if headless:chrome_options.add_argument("--headless")if not user_agent:user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.58"chrome_options.add_argument("user-agent=%s" % user_agent)if proxy:chrome_options.add_argument("proxy-server=%s" % proxy)if user_data_dir:chrome_options.add_argument("--user-data-dir=%s" % user_data_dir)if binary_location:chrome_options.binary_location = binary_location# 手动指定使用的浏览器位置if crx_dir:chrome_options.add_extension(crx_dir)# 自定义加载扩展crxdriver = webdriver.Chrome(chrome_options=chrome_options, executable_path=driver_path)driver.set_page_load_timeout(timeout)driver.set_script_timeout(timeout)return driverdef init_driver_with_exists_chrome():"""Start Chrome:C:\Users\user\AppData\Local\Google\Chrome\Application\chrome.exe --remote-debugging-port=6001 --user-data-dir="C:\ProgramFiles\Chrome2""""options = webdriver.ChromeOptions()options.add_experimental_option("debuggerAddress", "127.0.0.1:6001")driver = webdriver.Chrome(options=options)return driverdef wait_html(driver):while 1:time.sleep(0.5)if "Certification" in driver.page_source:print("Success!!! Certification")breakprint("Certification")# pass. to do nextdef auto_input(driver):# input keysdriver.find_element_by_xpath('//input[@name="CMT_SSN_1"]').send_keys("")# click button 1driver.find_element_by_xpath('//input[@name="CCA_QUIT_IND"][@value="https://tazarkount.com/read/N"]').click()# click button 2 (with js)driver.execute_script("""var e = document.createEvent("MouseEvents");e.initEvent("click", true, true);document.getElementById("nextBtn").dispatchEvent(e);""")# click button 3element = driver.find_element_by_id('login')webdriver.ActionChains(driver).move_to_element(element).click(element).perform()# selectionSelect(driver.find_element_by_xpath('//select[@name="CMT_ID_TYPE_CD"]')).select_by_index(2)Select(driver.find_element_by_xpath('//select[@name="CWE_CONTACT_OUTCOME_CD_02"]')).select_by_value("3")if __name__ == "__main__":url = "https://m.amap.com/service/poi/id.json?id=B0FFH5BLJA"driver_path = "spider_data/chromedriver.exe"init_driver(driver_path)
五、参考文章

  1. Python+Selenium基础入门及实践
  2. python中selenium使用
  3. Selenium Webdriver常用方法