zoukankan      html  css  js  c++  java
  • selenium无头浏览器--谷歌

        什么是无头浏览器?  

    无头浏览器,我理解的就是执行脚本的时候,不会打开浏览器的界面,但是代码依旧会执行

        无头浏览器什么时候用?    

    测试的时候需要打开浏览器,但是打开浏览器会影响正常的操作电脑,无法在同一台计算机上继续工作,

    或者在linux下运行脚本的时候,无需打开浏览器,只执行代码就行

    这时我们就用到了无头浏览器,无需打开浏览器,只需要执行代码

       先看一个简单的无头浏览器的配置,以谷歌的无头浏览器为例子    

    import time
    from selenium import webdriver
    
    
    # 创建一个参数对象,用来控制chrome以无界面模式打开
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')  # # 浏览器不提供可视化页面
    chrome_options.add_argument('--disable-gpu')  # 禁用GPU加速,GPU加速可能会导致Chrome出现黑屏,且CPU占用率高达80%以上
    
    # 创建浏览器对象
    driver = webdriver.Chrome(options=chrome_options, executable_path=r'/Users/Downloads/chromedriver')
    driver.implicitly_wait(10)  # 隐式等待
    
    # 访问URL
    driver.get('https://www.baidu.com')  # 未打开浏览器界面,即可执行代码
    print(driver.title)  # 百度一下,你就知道
    time.sleep(2)
    
    # 关闭浏览器
    driver.quit()

    selenium add_argument 参数表

    完整的参数参考官方文档:https://peter.sh/experiments/chromium-command-line-switches/

    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')
    
    –user-data-dir=”[PATH]”   # 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区。
    –disk-cache-dir=”[PATH]“  # 指定缓存Cache路径
    –first run  # 重置到初始状态,第一次运行
    --omnibox-popup-count="num"  # 将地址栏弹出的提示菜单数量改为num个。我都改为15个了。
    --user-agent="xxxxxxxx"  # 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果 
    --disable-plugins   # 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果 
    --disable-java   # 禁用java 
    --no-sandbox   # 取消沙盒模式
    --single-process   # 单进程运行
    --process-per-tab   # 每个标签使用单独进程
    --process-per-site   # 每个站点使用单独进程
    --in-process-plugins   # 插件不启用单独进程
    --disable-popup-blocking   # 禁用弹出拦截
    --disable-plugins   # 禁用插件
    --disable-images   # 禁用图像
    --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   # 启用书签同步

     

     

       实例:使用无头浏览器登录网易邮箱发送邮件   

    import time
    import datetime  # 获取当前时间
    from getpass import getpass  # 输入的密码时不显示
    from selenium import webdriver
    
    
    # 登录网易邮箱
    def longin(url, username, password):
        driver.get(url=url)
        driver.find_element_by_id('accname').send_keys(username)  # 输入用户名
        driver.find_element_by_id('accpwd').send_keys(password)  # 输入用户名
        driver.find_element_by_class_name('loginbtn').submit()  # 点击登录BTN
    
    
    # 写邮件并发送
    def send_email(title, addressee, msg):
        try:
            # 先登录
            longin(url, username, password)
            
            # 1、点击【写信】
            driver.find_element_by_class_name('p-edit').click()
            time.sleep(3)
            '''
            2、输入收件人和标题
               定位时使用某一种方法无法定位到,所以多种定位交叉使用
            '''
            driver.find_elements_by_class_name('right-inner')[0].find_element_by_name('to').find_element_by_tag_name(
                'input').send_keys(addressee)  # 输入收件人
            driver.find_elements_by_class_name('right-inner')[0].find_element_by_name('to').find_element_by_tag_name(
                'input').click()  # 点击一下收件人输入框,避免下拉框遮挡主题输入框
            driver.find_element_by_class_name('subject').find_element_by_tag_name('input').send_keys(title)  # 输入主题
            
            '''
            3、输入邮件内容(只有文本)
               因为文本框是在ifrme内的,ifrme是内嵌的网页元素,所以要先进入到ifrme内,再操作
            '''
            iframe = driver.find_element_by_id('ueditor_0')  # 先获取iframe,定位到它所在的位置
            driver.switch_to.frame(iframe)  # 切换到iframe中
            driver.find_element_by_xpath('/html/body').send_keys(msg)  # 在ifrme中操作元素,因为没有id也没有class,所以使用xpath
            driver.switch_to.default_content()  # 切换到iframe上之后,就无法对iframe以外的元素进行操作了,我们需要退出iframe再继续
            
            # 点击【发送】
            time.sleep(5)
            driver.find_element_by_id('main').find_element_by_class_name('g-mnc').find_element_by_xpath(
                '//*[@class="g-mnc"]/div[1]/div[1]/div[1]/div[1]').click()
            print('已发送完成!!!')
        finally:
            time.sleep(3)
            driver.close()  # 不管之前能否成功发送邮件,最后都关闭浏览器
    
    
    if __name__ == '__main__':
        chrome = r'/usr/local/bin/chromedriver'  # chrome驱动文件的路径
        
        url = 'https://qiye.163.com/login/?from=ym'  # 邮箱地址
        username = input('用户名:').strip()  # 邮箱账号
        password = getpass('密码:').strip()  # 邮箱密码
        
        addressee = input('收件人邮箱:')  # 收件人邮箱
        title = input('邮件标题:')  # 邮件标题
        text_msg = input('请输入邮件内容(只支持文本类型):')  # 邮件内容
        
        '''
        邮件内容
            datetime.datetime.now() 当前时间小数点后还有6位
            datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 当前时间,只精确到秒
        '''
        msg = '{}
    {}'.format(text_msg, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        
        '''
        无头浏览器配置
        '''
        chrome_options = webdriver.ChromeOptions()  # 建一个参数对象,用来控制chrome以无界面模式打开
        chrome_options.add_argument('--no-sandbox')  # 取消沙盒模式,浏览器的安全性会降低,如果不取消,linux下运行会报错
        chrome_options.add_argument('--disable-dev-shm-usage')  # 解决资源有限的问题
        chrome_options.add_argument('--headless')  # 浏览器不提供可视化页面
        chrome_options.add_argument('--disable-gpu')  # 禁用GPU加速
        
        driver = webdriver.Chrome(options=chrome_options, executable_path=chrome)  # 创建浏览器对象
        driver.implicitly_wait(10)  # 隐式等待10s
        
        send_email(title, addressee, msg)

     无头很简单,代码不变,只是加了无头配置

    上述代码中与原来的发邮件代码不同的地方如下:

    结束!

  • 相关阅读:
    HTML自学之旅(九)框架
    暑期逛世博 品文化新上海
    重构实践者手记(20130517)
    网页信息抓取DEMO
    正则表达式30分钟入门教程
    变量命名网站
    Thinkpad笔记本电脑进入BIOS不能选择UEFI/Legacy Boot选项
    Useful Expressions Business Correspondence
    DotNetNuke升级中遇到的问题
    DNN端口的问题
  • 原文地址:https://www.cnblogs.com/caoyinshan/p/12132295.html
Copyright © 2011-2022 走看看