zoukankan      html  css  js  c++  java
  • selenium的使用

    selenium的使用

    声明浏览器对象

    Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。此外,我们可以用如下方式进行初始化:

    from selenium import webdriver 
    
    browser = webdriver.Chrome()
    browser = webdriver.Firefox()
    browser = webdriver.Edge() 
    browser = webdriver.Safari()

    这样就完成了浏览器对象的初始化并将其赋值为 browser 对象。接下来,我们要做的就是调用 browser 对象,让其执行各个动作以模拟浏览器操作。

    访问页面

    我们可以用 get 方法来请求网页,只需要把参数传入链接 URL 即可。比如,这里用 get 方法访问淘宝,然后打印出源代码,代码如下:

    from selenium import webdriver  
    
    browser = webdriver.Chrome() 
    browser.get('https://www.taobao.com') 
    print(browser.page_source) 
    browser.close()

    运行后会弹出 Chrome 浏览器并且自动访问淘宝,然后控制台会输出淘宝页面的源代码,随后浏览器关闭。

    通过这几行简单的代码,我们就可以驱动浏览器并获取网页源码,非常便捷。

    定位网页元素

    1、find_element_by_id  # 通过id属性定位
    2、find_element_by_link_text   # 通过a标签文本信息定位(完整)
    3、find_element_by_partial_link_text # 通过a标签文本信息定位(部分文本)
    4、find_element_by_tag_name        # 根据标签名字找
    5、find_element_by_class_name      # 根据类名字找
    6、find_element_by_name            # name='xx' 根据name属性进行定位
    7、find_element_by_css_selector    # css选择器找
    8、find_element_by_xpath           # xpath选择器找

      # 强调:
      # 1、上述均可以改写成find_element(By.ID,'kw')的形式
      # 2、find_elements_by_xxx的形式是查找到多个元素,结果为列表

    #===============示范用法===================
    # 1、find_element_by_id
    print(driver.find_element_by_id('kw'))
    
    # 2、find_element_by_link_text
    # login=driver.find_element_by_link_text('登录')
    # login.click()
    
    # 3、find_element_by_partial_link_text
    login=driver.find_elements_by_partial_link_text('')[0]
    login.click()
    
    # 4、find_element_by_tag_name
    print(driver.find_element_by_tag_name('a'))
    
    # 5、find_element_by_class_name
    button=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'tang-pass-footerBarULogin')))
    button.click()
    
    # 6、find_element_by_name
    input_user=wait.until(EC.presence_of_element_located((By.NAME,'userName')))
    input_pwd=wait.until(EC.presence_of_element_located((By.NAME,'password')))
    commit=wait.until(EC.element_to_be_clickable((By.ID,'TANGRAM__PSP_10__submit')))
    
    input_user.send_keys('18611453110')
    input_pwd.send_keys('xxxxxx')
    commit.click()
    
    # 7、find_element_by_css_selector
    driver.find_element_by_css_selector('#kw')
    
    # 8、find_element_by_xpath
    ```

    元素交互操作

    • 元素名称.send_keys(value) 输入内容

    • 元素名称.clear() 清空用于有些输入的地方有默认值

    • 元素名称.click() 点击 主要用于按钮元素

    • 元素名称.submit() 提交

    • 按回车提交

    案例:通过selenium用百度搜索“美女”关键字

    from selenium import webdriver
    import time
    bro=webdriver.Chrome()
    bro.get("https://www.baidu.com"
    
    input_search=bro.find_element_by_xpath('//*[@id="kw"]')
    # 输入查找内容
    input_search.send_keys("美女")
    # 查找搜索按钮
    enter=bro.find_element_by_id('su')
    
    # 点击按钮
    enter.click()
    time.sleep(5)
    # 关闭浏览器
    bro.close())

    获取元素内容

    • 元素名称.text: 获取文本 (****重点)
    • 元素名称.get_attribute(attribute):获取元素内属性  (****重点)attribute为标签属性 
    • 元素名称.id :获取元素标签
    • 元素名称.location:获取元素名称
    • 元素名称.tag_name:获取元素标签名称
    • 元素名称.size:获取元素大小

    隐式等待

    implicitly_wait(隐式等待)

    • 隐式等待实际是设置了一个最长等待时间10秒

    • 如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。超出设定时间后,则抛出找不到节点的异常。

    • 只有控件没有加载出来才会等,控件一旦加载出来,直接就取到
    #隐式等待,失败概率高,可不用
    browser.implicitly_wait(10)
    #在10秒内,如果网页全部加载完成(包含js),则执行下一步,否则一直等到10秒结束后,在执行下一步

    案例:

    from selenium import webdriver
    import time
    
    bro=webdriver.Chrome()
    bro.get("https://www.baidu.com")
     
    bro.implicitly_wait(10)  # 设置隐式等待
    
    submit_button=bro.find_element_by_link_text('登录')
    submit_button.click()
    
    user_button=bro.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn')
    user_button.click()
    
    user_input=bro.find_element_by_id('TANGRAM__PSP_10__userName')
    user_input.send_keys("ssssss@qq.com")
    
    pwd_input=bro.find_element_by_id('TANGRAM__PSP_10__password')
    pwd_input.send_keys("123456")
    
    
    submit_input=bro.find_element_by_id('TANGRAM__PSP_10__submit')
    submit_input.click()
    
    time.sleep(5)
    bro.close()
    View Code

    获取cookie

    使用 Selenium,还可以方便地对 Cookies 进行操作,例如获取、添加、删除 Cookies 等

    from selenium import webdriver 
    
    browser = webdriver.Chrome() 
    browser.get('https://www.zhihu.com/explore') 
    print(browser.get_cookies()) 
    browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'}) 
    print(browser.get_cookies()) 
    browser.delete_all_cookies() 
    print(browser.get_cookies())
    
    #搭建cookie池和代理池的作用是什么?封ip ,封账号(弄一堆小号,一堆cookie)

    首先,我们访问知乎,加载完成后,浏览器实际上已经生成 Cookies 了。接着,调用 get_cookies 方法获取所有的 Cookies。然后,我们再添加一个 Cookie,这里传入一个字典,有 name、domain 和 value 等内容。接下来,再次获取所有的 Cookies,可以发现,结果会多出这一项新加的 Cookie。最后,调用 delete_all_cookies 方法删除所有的 Cookies。再重新获取,发现结果就为空了。

    无界面浏览器(驱动谷歌,驱动其他浏览器)

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
    chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
    chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
    chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
    chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
    
    bro=webdriver.Chrome(options=chrome_options)
    bro.get("https://www.baidu.com")
    print(bro.get_cookies())
    bro.close()

    前进后退

    平常我们使用浏览器时都有前进和后退功能,Selenium 也可以完成这个操作,它使用 back 方法后退,使用 forward 方法前进。示例如下:

    import time
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.baidu.com/')
    browser.get('https://www.taobao.com/')
    browser.get('https://www.zhihu.com/')
    browser.back()
    time.sleep(1)
    browser.forward()
    browser.close()

    执行js

    Selenium API 并没有提供实现某些操作的方法,比如,下拉进度条。但它可以直接模拟运行 JavaScript,此时使用 execute_script 方法即可实现,代码如下:

    from selenium import webdriver 
    
    browser = webdriver.Chrome() 
    browser.get('https://www.zhihu.com/explore') 
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') 
    browser.execute_script('alert("To Bottom")')

    这里利用 execute_script 方法将进度条下拉到最底部,然后弹出 alert 提示框。

    有了这个方法,基本上 API 没有提供的所有功能都可以用执行 JavaScript 的方式来实现了。

    选项卡管理

    在访问网页的时候,我们通常会开启多个选项卡。在 Selenium 中,我们也可以对选项卡进行操作。示例如下:

    import time
    from selenium import webdriver
    
    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.execute_script('window.open()')
    
    print(browser.window_handles) #获取所有的选项卡
    browser.switch_to_window(browser.window_handles[1])  #[1]表示跳转到第几个选项卡
    browser.get('https://www.taobao.com')
    time.sleep(2)
    browser.switch_to_window(browser.window_handles[0])
    browser.get('https://www.sina.com.cn')
    browser.close()

    异常处理

    在使用 Selenium 的过程中,难免会遇到一些异常,例如超时、节点未找到等错误,一旦出现此类错误,程序便不会继续运行了。这里我们可以使用 try except 语句来捕获各种异常。

    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
    
    try:
        browser = webdriver.Chrome()
        browser.get('http://www.baidu.com')
        browser.find_element_by_id("xxx")
    
    except Exception as e:
        print(e)
    finally:
        browser.close()

    动作链

    from selenium.webdriver import ActionChains
    # 1 生成一个动作练对象
    action=ActionChains(bro)
    # 2 点击并夯住某个控件
    action.click_and_hold(div)
    # 3 移动方式(三种方式)
    # action.move_by_offset(x, y) # 通过坐标偏移
    # action.move_to_element(x, y) # 到另一个标签
    # action.move_to_element_with_offset(x, y) # 到另一个标签,再偏移一部分
    
    # 4 真正移动
    action.perform()
    
    # 5 释放控件(松开鼠标)
    action.release()
  • 相关阅读:
    C语言I博客作业04
    C语言I博客作业03
    C语言I—2019秋作业02
    C语言I博客作业01
    JSP 基础语法
    JavaScript
    Hadoop简介
    用流从一个指定的网址抓取html代码
    内容采集
    SpringMVC控制器与视图的数据交换
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12669853.html
Copyright © 2011-2022 走看看