# 切换新标签页
    # 要知道,浏览器的功能用selenium基本都能实现

    from selenium import webdriver
    browser = webdriver.Chrome(execute_path='chrome.exe')

    # 访问百度
    browser.get("https://www.baidu.com")

    # 访问新标签,hao123
    # browser.find_element(by='partial link text', value="hao123")
        # -find_element-by_partial_link_text(链接文本) 根据链接包含的文本获取元素列表
    hao123 = browser.find_element(by='partial link text', value="hao123")
    hao123.click()# 点击

    # 切换标签页
    current_windows = browser.window_handles # 返回一个列表,包括selenium控制浏览器的所有窗口
    # 列表中就是一个窗口对象

    #switch_to方法切换标签页
    browser.switch_to.windows(current_windows[0])   # 切换第一个标签页
    browser.switch_to.windows(current_windows[1])   # 切换第二个标签页

    browser.quit()      # 关闭浏览器
    browser.close()     # 关闭当前标签页

# iframe标签切换(xpath解析不了iframe,所以需要用selenium)
    browser = webdriver.Chrome(execute_path='chrome.exe')
    browser.get("https://qzone.qq.com/")    # 访问qq空间登录页面

    # iframe时html种常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了
    # iframe中的内容的,对应的解决思路是浏览器对象.switch_to.frame(frame.element)
        # 切换到定位frame标签嵌套的页面中

    # -chrome_obj.switch_to.frame(通过find_element_by函数定位的frame、iframe标签对象)

        frame = browser.find_element_by_id("login_frame")
        # 注意,有id的情况,通过id是可以定位到iframe的,但是同样无法通过xpath进行数据解析!!!

        browser.switch_to.frame(frame)通过定位好的iframe进入该标签
        # 如此就可以再通过xpath解析其中数据了

    # 接下来进行qq空间模拟登录
        res = browser.find_element_by_xpath('//*[@id="switcher_plogin"]')
        # 通过xpath找到账号登录界面
        res.click()点击进入
        # 如此可以找到了两个文本框了(账号,密码)

        username = browser.find_element_by_xpath('//*[@id="u"]') # 账号框
        password = browser.find_element_by_xpath('//*[@id="p"]') # 密码框

        username.sen_keys("qq账号")
        password.sen_keys("qq密码")
        # 通过sen_keys()方法输入账号密码

        # 找到登录按键
        login_button = browser.find_element_by_xpath('//*[@id="login_button"]')
        # 点击登录
        login_button.click()

        # 但是一般会有扫码验证过程,可以通过抓扫码的带入信息包来通过验证


# selenium处理cookie
    # 获取:
        # driver.get_cookies()方法,返回一个列表,其中包含完整的cookie信息!
        # 不仅有name、value,还有domain(域名)等cookie其他维度的信息。(多个cookie包,分别记录每一次行为的cookie信息)
        # 所以如果想要把获取的cookie信息和requests模块配合使用的话,还需要转换为name、value作为键值对的cookie字典

    # 删除:
        # 删除一条cookie
            # driver.delete_cookie("CookieName")
        # 删除所有的cookie
            # driver.delete_all_cookies()

# 页面等待
    # 为什么要在selenium中等待?
        # 大多数Web应用程序都是使用Ajax和JavaScrip开发的。当浏览器加载页面时,我们想要与之交互的元素可能以不同的时间间隔加载,
        它不仅难以识别元素,而且如果元素为定位,它将抛出"ElementNotVisibleException"异常。使用waits可以解决此问题。
    # 隐式等待:
        -隐式等待针对的是元素定位,隐式等待设置了一个时间,再一段时间内判断元素是否
            定位成功,如果完成了就进行下一步(不会傻乎乎的等完设置时间)
        -在设置的时间呢i如果没有定位成功,则会报超时加载
        -语法:driver.implicitly_wait(等待时间) 最长20s

# 动作链
    # selenium中提供了动作链方法,相当于在浏览器中实行链式动作,例如拖拽、鼠标右键,双击,滚轮等等
    # 即模拟人为的按照一定顺序的操作

    from selenium.webdriver.common.action_chains import ActionChains # 动作链模块

    # 拖拽
        # 通过iframe定位滑块后可拖拽滑块
        browser.switch_to.frame(通过find_element_by函数定位的frame、iframe标签对象)
        # 再通过id抓到
        block = browser.find_element_id(id) # 抓到滑块标签
        action = ActionChains(browser)    # 创建动作连对象,传入浏览器对象
        action.click_and_hold(block).perform()    # 点击一直保持,持续按住,动啥传入啥
        action.move_by_offset(横坐标,纵坐标)  # 要移动的像素点坐标delta
        # 行为动作添加之后不会立即执行,而是将这些行为添加到一个队列中,等待动作链释放
        action.release()   # 执行动作链(释放)
        # action.click(block).perform() #(若无用释放再点击一下)


才疏学浅,点个赞吧哥哥!