selenium模块 快速上手

selenium 模块

  • selenium中文文档https://python-selenium-zh.readthedocs.io/zh_CN/latest/

快速上手

  • 示例1:

    #爬取全历史一个页面的画作名字
    from selenium import webdriver
    from time import sleep
    from lxml import etree
    
    # 实例化对象  PS:需要先下载浏览器驱动http://chromedriver.storage.googleapis.com/index.html
    driver = webdriver.Chrome()    # Chrome浏览器
    # 发起请求,访问页面
    driver.get('https://www.allhistory.com/painting')
    # 等待页面某些元素加载 现在很多Web应用都在使用AJAX技术。浏览器载入一个页面时,页面内的元素可能是在不同的时间载入的
    sleep(1)
    # 定位到页面最下方‘知道了’按钮,并点击
    driver.find_element_by_class_name('cookie-banner-btn').click()
    # 获取页面源码
    page_text = driver.page_source
    
    # xpath定位
    tree = etree.HTML(page_text)
    imgList_li = tree.xpath('//*[@id="imglist"]/ul//li')
    imgList = []
    for i in imgList_li:
        title = i.xpath('./div[@class="imagetitle"]/text()')[0].strip()
        imgList.append({'imagetitle':title})
        print(title)
    # 等待3秒
    sleep(3)
    # 关闭浏览器驱动对象
    driver.quit() #关闭浏览器
    #driver.close() #关闭当前页面
    
  • 示例2(模拟登陆):

    input_name = driver.find_element_by_xpath('') #定位到用户名输入框
    input_pass = driver.find_element_by_xpath('')
    button_submit = driver.find_element_by_xpath('')
    input_name.send_keys('username') #输入用户名
    input_pass.send_keys('password')
    button_submit.click() #点击提交
    

元素定位

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
   <input name="continue" type="button" value="Clear" />
  </form>
   <p>Are you sure you want to do this?</p>
   <a href="continue.html">Continue</a>
   <a href="cancel.html">Cancel</a>
   <p class="content">Site content goes here.</p>
 </body>
<html>
  • 根据Id定位

    • login_form = driver.find_element_by_id('loginForm')
  • 根据 Name 定位

    • username = driver.find_element_by_name('username')
    • password = driver.find_element_by_name('password')
  • 用链接文本定位超链接

    • continue_link = driver.find_element_by_link_text('Continue')
    • continue_link = driver.find_element_by_partial_link_text('Conti')
  • 标签名定位

    • heading1 = driver.find_element_by_tag_name('p')
  • class定位(定位p元素)

    • content = driver.find_element_by_class_name('content')
  • css选择器定位(定位p元素)

    • content = driver.find_element_by_css_selector('p.content')

等待

  • 显示等待(推荐使用显式)

    • 显式的waits等待一个确定的条件触发然后才进行更深一步的执行。最糟糕的的做法是time.sleep(),这指定的条件是等待一个指定的时间段。 这里提供一些便利的方法让你编写的代码只等待需要的时间,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
      
      driver = webdriver.Firefox()
      driver.get("http://somedomain/url_that_delay_loading")
      try:
          element = WebDriverWait(driver,10).until(
              EC.presence_of_element_located((By.ID,"myDynamicElement"))
          )
      finally:
          driver.quit()
      

      这段代码会等待10秒,如果10秒内找到元素则立即返回,否则会抛出TimeoutException异常,WebDriverWait默认每500毫秒调用一下ExpectedCondition直到它返回成功为止。ExpectedCondition类型是布尔的,成功的返回值就是true,其他类型的ExpectedCondition成功的返回值就是 not null

  • 隐式等待

    • 当我们要找一个或者一些不能立即可用的元素的时候,隐式waits会告诉WebDriver轮询DOM指定的次数,默认设置是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')
      

行为链

  • 详细说明:https://python-selenium-zh.readthedocs.io/zh_CN/latest/7.2%20%E8%A1%8C%E4%B8%BA%E9%93%BE/

  • ActionChains可以完成简单的交互行为,例如鼠标移动,鼠标点击事件,键盘输入,以及内容菜单交互。这对于模拟那些复杂的类似于鼠标悬停和拖拽行为很有用

  • menu = driver.find_element_by_css_selector(".nav")
    hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
    
    actions = ActionChains(driver)
    actions.move_to_element(menu)
    actions.click(hidden_submenu)
    action.perform() #按顺序执行
    
  • click(on_element=None)

    点击一个元素

    参数: * on_element:要点击的元素,如果是None,点击鼠标当前的位置

    click_and_hold(on_element=None)

    鼠标左键点击一个元素并且保持

    参数: * on_element:同click()类似

    double_click(on_element=None)

    双击一个元素

    参数: * on_element:同click()类似

    drag_and_drop(source, target)

    鼠标左键点击source元素,然后移动到target元素释放鼠标按键

    参数: source:鼠标点击的元素 target:鼠标松开的元素

    drag_and_drop_by_offset(source, xoffset,yoffset)

    拖拽目标元素到指定的偏移点释放

    参数: source:点击的参数 xoffset:X偏移量 * yoffset:Y偏移量

    key_down(value,element=None)

    只按下键盘,不释放。我们应该只对那些功能键使用(Contril,Alt,Shift)

    参数: value:要发送的键,值在Keys类里有定义 element:发送的目标元素,如果是None,value会发到当前聚焦的元素上

    例如,我们要按下 ctrl+c:

    ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
    

    key_up(value,element=None)

    释放键。参考key_down的解释

    move_by_offset(xoffset,yoffset)

    将当前鼠标的位置进行移动

    参数: xoffset:要移动的X偏移量,可以是正也可以是负 yoffset:要移动的Y偏移量,可以是正也可以是负

    move_to_element(to_element)

    把鼠标移到一个元素的中间

    参数: * to_element:目标元素

    move_to_element_with_offset(to_element,xoffset,yoffset)

    鼠标移动到元素的指定位置,偏移量以元素的左上角为基准

    参数: to_element:目标元素 xoffset:要移动的X偏移量 * yoffset:要移动的Y偏移量

    perform()

    执行所有存储的动作

    release(on_element=None)

    释放一个元素上的鼠标按键,

    参数: * on_element:如果为None,在当前鼠标位置上释放

    send_keys(*keys_to_send)

    向当前的焦点元素发送键

    参数: * keys_to_send:要发送的键,修饰键可以到Keys类里找到

    send_keys_to_element(element,*keys_to_send)

    向指定的元素发送键

切换窗口

  • 循环切换每个窗口

    for handle in driver.window_handles:
        driver.switch_to.window(handle)
    
  • 切换到某一个窗口
    driver.switch_to.frame(driver.window_handles[0])

  • 框架和框架之间切换
    driver.switch_to_frame("frameName")
    driver.switch_to_frame("frameName.0.child")

  • 弹出对话框
    alert = driver.switch_to_alert()

  • 在浏览器的历史记录的后退或者前进
    driver.forward()

    driver.back()

  • cookies

    # Go to the correct domain
    driver.get("http://example.com")
    
    # Now set the cookie. This one's valid for the entire domain
    cookie = {'name':'foo','value':'bar'}
    driver.add_cookie(cookie)
    
    # And now output all the available cookies for the current URL
    driver.get_cookies()
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值