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)

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

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

    结束!

  • 相关阅读:
    韩式英语
    Daily dictation 听课笔记
    words with same pronunciation
    you will need to restart eclipse for the changes to take effect. would you like to restart now?
    glottal stop(britain fountain mountain)
    education 的发音
    第一次用Matlab 的lamada语句
    SVN的switch命令
    String的split
    SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
  • 原文地址:https://www.cnblogs.com/caoyinshan/p/12132295.html
Copyright © 2011-2022 走看看