# 切换新标签页
# 要知道,浏览器的功能用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() #(若无用释放再点击一下)
才疏学浅,点个赞吧哥哥!