全网超级详细的selenium介绍!

python模块——selenium 详细

一.安装

二.常用方法详细

  • 1.创建实例
    • selenium.webdriver 模块提供了所有WebDriver的实现
    from selenium import webdriver
    driver = webdriver.Chrome()  # 创建chrome实例
    driver = webdriver.Firefox()  # 创建Fierfox 实例
    
  • 2.打开某个地址
    • driver.get()方法将打开指定的URL地址,直到页面完全加载完毕,返回继续执行,如果页面使用大量的Ajax 加载, WebDriver可能不知道什么时候页面已经完全加载
    from selenium import webdriver
    driver = webdriver.Chrome()  # 创建chrome实例
    driver.get("www.zhihuishu.com")
    
  • 3.定位元素(重点)
    • WebDriver 提供了大量的方法让你去查询页面中的元素
    • 3.1:公有八种匹配方法
      • 注意:element 定位的时候单个元素,elements 定位是多个元素返回的是个列表
    元素方法异常
    iddriver.find_element_by_id()NoSuchElementException
    namedriver.find_element_by_name()NoSuchElementException
    class_namedriver.find_element_by_class_name()NoSuchElementException
    link_txetdriver.find_element_by_link_text()NoSuchElementException
    tag_namedriver.find_element_by_tag_name()NoSuchElementException
    xpathdriver.find_element_by_xpathNoSuchElementException
    cssdriver.find_element_by_css_selector()NoSuchElementException
    partial_link_textdriver.find_element_by_partial_link_text()NoSuchElementException
    • 举个栗子:
    <html>
     <body>
      <form id="loginForm">
       <p class="content">Site content goes here.</p>
       <h1>Welcome</h1>
       <input name="username" type="text" />
       <input name="password" type="password" />
       <input name="continue" type="submit" value="Login" />
       <input name="continue" type="button" value="Clear" />
       <p class="content">Site content goes here.</p>
       <p>Are you sure you want to do this?</p>
       <a href="continue.html">Continue</a>
       <a href="cancel.html">Cancel</a>
      </form>
     </body>
    <html>
    
    • 示例

      • 通过ID定位:login_form = driver.find_element_by_id('loginForm')
      • 通过Name定位:username = driver.find_element_by_name('username')
      • 通过Xpath定位:login_form = driver.find_element_by_xpath("/html/body/form[1]") 绝对定位 (页面结构轻微调整就会被破坏)
      • 链接文本获取超链接:continue_link = driver.find_element_by_link_text('Continue')
      • 标签名查找元素:heading1 = driver.find_element_by_tag_name('h1')
      • Class name 定位元素:content = driver.find_element_by_class_name('content')
      • CSS选择器查找元素:content = driver.find_element_by_css_selector('p.content')
    • 3.2:私有两个方法
    from selenium.webdriver.common.by import By
    driver.find_element(By.XPATH, '//button[text()="Some text"]')
    driver.find_elements(By.XPATH, '//button')
    
    • 可用属性:
    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"
    
    • 3.3:模糊匹配
      • 匹配头部:self.driver.find_element_by_css_selector('div[style^="sp.gif"]').click()

      • 匹配尾部:self.driver.find_element_by_css_selector('div[style$="sp.gif"]').click()

      • 匹配中间:self.driver.find_element_by_css_selector('div[style*="sp.gif"]').click()

      • xpath中的模糊匹配:

        • 匹配开始:starts-with
          比如:driver.find_elements_by_xpath('//li[starts-with(@class,"clearfix video")]')

        • 匹配属性中包含的字符串:contains
          比如:driver.find_elements_by_xpath('//li[contains(@class,"clearfix video")]')

        • 匹配显示文本信息:text()
          比如:driver.find_elements_by_xpath(//a[text()='智慧树'])

  • 4.等待

    现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作。

    • 显式等待:(重要)

      会让WebDriver等待满足一定的条件以后再进一步的执行。

      使用方法:WebDriverWait(driver, 超时时间, 调用频率, 要忽略的异常).until(要执行的方法, 超时时返回的错误信息)

      WebDriverWait结合ExpectedCondition 是实现的一种方式

       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
       
       WebDriverWait (driver, timeout=True, poll_frequency=10).until (EC.presence_of_element_located ((By.CLASS_NAME, "topic-item")))
       # 如果在timeout的时间内没有找到就会抛出` TimeoutException` 异常
       
      
      • 解释:
        • driver当前实例的对象

        • timeout:最长等待的时间

        • poll_frequency:多少秒检测一次 默认0.5

        • EC.presence_of_element_located ((By.CLASS_NAME, “topic-item”)):判断class_name=topic-item元素是否已经成功加载。

        • 忽略异常:如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。

    • WebDriverWait()类
      • until()方法:条件成立为真

      • until_not()方法:条件不成立为真也就是没有指定的元素为真

    • expected_conditions()类
      • element_located_selection_state_to_be():判断一个元素的状态是否是给定的选择状态

      • element_selection_state_to_be():判断给定的元素是否被选中

      • element_located_to_be_selected():期望某个元素处于被选中状态

      • element_to_be_selected():期望某个元素处于选中状态

      • element_to_be_clickable():判断元素是否可见并且能被单击,条件满足返回页面元素对象,否则返回Flase

      • frame_to_be_available_and_switch_to_it():判断frame是否可用

      • invisibility_of_element_located():希望某个元素不可见或者不存在DOM中,满足条件返回True,否则返回定位到的元素对象

      • visibility_of_element_located():希望某个元素出现在DOM中并且可见,满足条件返回该元素的页面元素对象

      • visibility_of():希望某个元素出现在页面的DOM中,并且可见,满足条件返回该元素的页面元素对象

      • visibility_of_any_elements_located():希望某个元素出现在DOM中并且可见

      • presence_of_all_elements_located():判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的压面元素

      • presence_of_element_located(locator):判断某个元素是否存在DOM中,不一定可见,存在返回该元素对象

      • staleness_of(webelement):判断一个元素是否仍在DOM中,如果在规定时间内已经移除返回True,否则返回Flase

      • text_to_be_present_in_element():判断文本内容test是否出现在某个元素中,判断的是元素的text

      • text_to_be_present_in_element_value():判断text是否出现在元素的value属性值中

      • title_contains():判断页面title标签的内容包含partial_title,只需要部分匹配即可,包含返回True,不包含返回Flase

      • title_is():判断页面title内容是与传入的title_text内容完全匹配,匹配返回True,否则返回Flase

  • 隐式等待

    让Webdriver等待一定的时间后再才是查找某元素。

    • implicitly_wait(3) 如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束
  • 强制等待
    • 强制让浏览器等待,不管当前操作是否完成
      import time
      time.sleep(3)
    
  • 5.鼠标操作
    • Action Chains类常用于模拟鼠标的行为,比如单击,双击,拖拽等行为
    • from selenium.webdriver.common.action_chains import ActionChains
    • 常用方法
      • click() 鼠标单击
      • click_and_hold() 鼠标单击长按
      • context_click() 右击
      • double_click() 双击
      • drag_and_drop_by_offset(source, xoffset, yoffset)
        • source: The element to mouse down.
        • xoffset: X offset to move to.
        • yoffset: Y offset to move to.
      • key_down() 按下某个键
      • key_up()放开某键
  • 6.键盘操作
    • from selenium.webdriver.common.keys import Keys
    • 常用按键(其他可以查看keys.py文件)
      • 组合
        • 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)
      • 非组合
        • 回车键:Keys.ENTER
        • 删除键:Keys.BACK_SPACE
        • 空格键:Keys.SPACE
        • 制表键:Keys.TAB
        • 回退键:Keys.ESCAPE
        • 刷新键:Keys.F5
  • 7.执行js
    • 为什么要用js
      • 在做自动化的时候可能遇见无法对元素操作的情况,比如在做智慧树登录的时候,直接使用webdriver 点击登录是会被检测到的
    • 内置方法
      • driver.execute_script()
      • 栗子:
        • 进行输入内容
          • driver.execute_script ('document.getElementById("lUsername").value="{}"'.format (username))
        • 进行点击
          • driver.execute_script ('document.getElementById("lUsername").click())
  • 8.chrome options参数
    • chrome options 是配置chrome启动时属性的类
      • 设置 chrome 二进制文件位置 (binary_location)
      • 添加启动参数 (add_argument)
        • 设置ua
        from selenium import webdriver
        options = webdriver.ChromeOptions()
        options.add_argument('user-agent="Mozilla/5.0 (X11; Linux x86_64)   AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"')
        driver = webdriver.Chrome(chrome_options = options)
        
        • 设置ip代理
        from selenium import webdriver
        options = webdriver.ChromeOptions ()
        chromeOptions = webdriver.ChromeOptions()
        chromeOptions.add_argument('--proxy-server=http://ip:port')
        # 设置ip还有端口  
        driver = webdriver.Chrome(chrome_options=chromeOptions)
        
        • 其他常用
          chrome_options.add_argument('--user-agent=""')  # 设置请求头的User-Agent
          chrome_options.add_argument('--window-size=1280x1024')  # 设置浏览器分辨率(窗口大小)
          chrome_options.add_argument('--start-maximized')  # 最大化运行(全屏窗口),不设置,取元素会报错
          chrome_options.add_argument('--disable-infobars')  # 禁用浏览器正在被自动化程序控制的提示
          chrome_options.add_argument('--incognito')  # 隐身模式(无痕模式)
          chrome_options.add_argument('--hide-scrollbars')  # 隐藏滚动条, 应对一些特殊页面
          chrome_options.add_argument('--disable-javascript')  # 禁用javascript
          chrome_options.add_argument('--blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
          chrome_options.add_argument('--headless')  # 浏览器不提供可视化页面
          chrome_options.add_argument('--ignore-certificate-errors')  # 禁用扩展插件并实现窗口最大化
          chrome_options.add_argument('--disable-gpu')  # 禁用GPU加速
          chrome_options.add_argument('–disable-software-rasterizer')
          chrome_options.add_argument('--disable-extensions')  # 禁用扩展
          chrome_options.add_argument('--start-maximized')  # 最大化
        
      • 添加扩展应用 (add_extension, add_encoded_extension)
      • 添加插件
      extension_path = '插件路径'
      chrome_options.add_extension(extension_path)
      
      • 添加实验性质的设置参数 (add_experimental_option)
        • 禁止图片加载
        from selenium import webdriver
        chrome_options = webdriver.ChromeOptions()
        prefs = {"profile.managed_default_content_settings.images": 2}
        chrome_options.add_experimental_option("prefs", prefs)
        
        • 禁用保存密码
        prefs = {"": ""}
        prefs["credentials_enable_service"] = False
        prefs["profile.password_manager_enabled"] = False
        chrome_options.add_experimental_option ("prefs", prefs)
        
        • 禁用弹窗
        禁用浏览器弹窗
        prefs = {  
        'profile.default_content_setting_values' :  {  
            'notifications' : 2  
         }  
        }  
        chrome_options.add_experimental_option('prefs',prefs) 
        
      • 设置调试器地址 (debugger_address)
    • cookie
      • 设置cookie
      driver.delete_all_cookies()# 删除cookie
      driver.add_cookie({'name':'ABC','value':'DEF'})  # 携带cookie
      driver.get_cookies()  # 获取cookie
      

公众号:Linux下撸python
期待和你再次相遇
愿你学的愉快

在这里插入图片描述

  • 8
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Artisan_C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值