• Selenium Python


    Selenium Python 教程 - 知乎

    目录

    准备工作

    1. 安装seleniumm

    pip install selenium

    1. 下载浏览器驱动

    Firefox 浏览器驱动:geckodriver

    Chrome 浏览器驱动:chromedriver , taobao 备用地址

    IE 浏览器驱动:IEDriverServer

    Edge 浏览器驱动:MicrosoftWebDriver

    Opera 浏览器驱动:operadriver

    PhantomJS 浏览器驱动:phantomjs

    需要把浏览器驱动放入系统路径中,或者直接告知 selenuim 的驱动路径

    另外启动浏览器,可以设置一些参数,比如无界面之类的,详细参考:

    补充上面一个参数,添加代理:options.add_argument("--proxy-server=http://XXXXX.com:80")

    可以测试是否正常使用,以下代码:

    from selenium import webdriver
    
    driver = webdriver.Firefox()   # Firefox浏览器
    # driver = webdriver.Firefox("驱动路径")
    
    driver = webdriver.Chrome()    # Chrome浏览器
    
    driver = webdriver.Ie()        # Internet Explorer浏览器
    
    driver = webdriver.Edge()      # Edge浏览器
    
    driver = webdriver.Opera()     # Opera浏览器
    
    driver = webdriver.PhantomJS()   # PhantomJS
    
    # 打开网页
    driver.get(url) # 打开url网页 比如 driver.get("http://www.baidu.com")
    

    2021 年 6 月 27 日 补充

    selenium 登录新版的edge方法

    首先,安装pip install msedge-selenium-tools

    接下来,使用以下代码:

    from selenium import webdriver
    from msedge.selenium_tools import Edge, EdgeOptions
    options = EdgeOptions()
    options.use_chromium = True
    options.binary_location = r"C:\xx\Microsoft\EdgeCore\93.0.926.0\msedge.exe" # 浏览器的位置
    driver = Edge(options=options, executable_path=r"D:\xx\Desktop\edgedriver_win64\msedgedriver.exe") # 相应的浏览器的驱动位置
    
    driver.get("http://www.baidu.com")
    
    

    元素定位

    find_element_by_id()
    find_element_by_name()
    find_element_by_class_name()
    find_element_by_tag_name()
    find_element_by_link_text()
    find_element_by_partial_link_text()
    find_element_by_xpath()
    find_element_by_css_selector()
    

    element变成elements就是找所有满足的条件,返回数组。

    一般我都自己采用 xpath 获取元素的,复制即可

    关于获取对象的 api 查找:

    控制浏览器操作

    • 控制浏览器窗口大小

    driver.set_window_size(480, 800)

    • 浏览器后退,前进

    # 后退 driver.back()

    # 前进 driver.forward()

    • 刷新

    driver.refresh() # 刷新

    Webelement 常用方法

    • 点击和输入

    driver.find_element_by_id("kw").clear() # 清楚文本 driver.find_element_by_id("kw").send_keys("selenium") # 模拟按键输入 driver.find_element_by_id("su").click() # 单机元素

    • 提交

    可以在搜索框模拟回车操作

    search_text = driver.find_element_by_id('kw') search_text.send_keys('selenium') search_text.submit()

    • 其他

    size: 返回元素的尺寸。

    text: 获取元素的文本。

    get_attribute(name): 获得属性值。

    is_displayed(): 设置该元素是否用户可见。

    鼠标操作

    在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。

    ActionChains 类提供了鼠标操作的常用方法:

    • perform(): 执行所有 ActionChains 中存储的行为;

    • context_click(): 右击;

    • double_click(): 双击;

    • drag_and_drop(): 拖动;

    • 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")
    
    # 定位到要悬停的元素
    above = driver.find_element_by_link_text("设置")
    # 对定位到的元素执行鼠标悬停操作
    ActionChains(driver).move_to_element(above).perform()
    

    键盘事件

    以下为常用的键盘操作:

    • send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

    • send_keys(Keys.SPACE) 空格键 (Space)

    • send_keys(Keys.TAB) 制表键 (Tab)

    • send_keys(Keys.ESCAPE) 回退键(Esc)

    • send_keys(Keys.ENTER) 回车键(Enter)

    • send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)

    • send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)

    • send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)

    • send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)

    • send_keys(Keys.F1) 键盘 F1

    • ……

    • send_keys(Keys.F12) 键盘 F12

    # 输入框输入内容
    driver.find_element_by_id("kw").send_keys("seleniumm")
    
    # 删除多输入的一个 m
    driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
    

    获取断言信息

    title = driver.title # 打印当前页面title
    now_url = driver.current_url # 打印当前页面URL
    user = driver.find_element_by_class_name('nums').text # # 获取结果数目
    

    等待页面加载完成

    • 显示等待

    显式等待使 WebdDriver 等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    
    element = WebDriverWait(driver, 5, 0.5).until(
                          EC.presence_of_element_located((By.ID, "kw"))
                          )
    element.send_keys('selenium')
    driver.quit()
    

    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。

    在本例中,通过 as 关键字将 expected_conditions 重命名为 EC,并调用 presence_of_element_located() 方法判断元素是否存在。

    • 隐式等待

    如果某些元素不是立即可用的,隐式等待是告诉 WebDriver 去等待一定的时间后去查找元素。 默认等待时间是 0 秒,一旦设置该值,隐式等待是设置该 WebDriver 的实例的生命周期。

    from selenium import webdriver
    driver = webdriver.Firefox()    
    driver.implicitly_wait(10) # seconds    
    driver.get("http://somedomain/url_that_delays_loading")    
    myDynamicElement = driver.find_element_by_id("myDynamicElement") 
    

    在不同的窗口和框架之间移动

    driver.switch_to_window("windowName")
    driver.switch_to_frame("frameName")
    

    以直接取表单的 id 或 name 属性。如果 iframe 没有可用的 id 和 name 属性,则可以通过下面的方式进行定位。

    #先通过xpth定位到iframe
    xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
    
    #再将定位对象传给switch_to_frame()方法
    driver.switch_to_frame(xf)
    

    一旦我们完成了 frame 中的工作,我们可以这样返回父 frame:

    driver.switch_to_default_content()
    

    警告框处理

    alert = driver.switch_to_alert()
    
    • text:返回 alert/confirm/prompt 中的文字信息。

    • accept():接受现有警告框。

    • dismiss():解散现有警告框。

    • send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框。

    下拉框选择

    from selenium import webdriver
    from selenium.webdriver.support.select import Select
    from time import sleep
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get('http://www.baidu.com')
    sel = driver.find_element_by_xpath("//select[@id='nr']")
    Select(sel).select_by_value('50')  # 显示50条
    

    文件上传

    driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')  # # 定位上传按钮,添加本地文件
    

    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 信息

    调用 JavaScript 代码

    js="window.scrollTo(100,450);"
    driver.execute_script(js) # 通过javascript设置浏览器窗口的滚动条位置
    

    通过 execute_script() 方法执行 JavaScripts 代码来移动滚动条的位置。

    窗口截图

    driver.get_screenshot_as_file("D:\\baidu_img.jpg") # 截取当前窗口,并指定截图图片的保存位置
    

    关闭浏览器

    • close() 关闭单个窗口

    • quit() 关闭所有窗口

    • * *

    链接:https://www.jianshu.com/p/773c58406bdb

    1. 手动获取网页的 cookie,将其序列化并存储在本地

    2. 写入代码

    for item in cookies:
        driver.add_cookie(item)
    

    参考链接:

    1. http://www.testclass.net/selenium_python

    2. https://selenium-python-zh.readthedocs.io/en/latest/index.html

      https://zhuanlan.zhihu.com/p/111859925

  • 相关阅读:
    Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测
    点击率预估
    论文列表——text classification
    retrofit+RXjava二次封装
    Twitter Lite以及大规模的高性能React渐进式网络应用
    《设计模式》结构型模式
    maven多module项目中千万不要引入其它模块的单元測试代码
    Jenkins配置基于角色的项目权限管理
    读《百度基础架构技术发展之路》有感
    <html>
  • 原文地址:https://www.cnblogs.com/springsnow/p/16223760.html
Copyright © 2020-2023  润新知