元素操作(附带鼠标悬停)
一些课程回顾,问题原因总结
函数只有在return的时候,才会返回一个数据。返回数据了才可以赋值的
报错:
- 等待时间不够
- 返回的元素不是你想要的
- 确实是你表达式写错了
- 有句柄未切换或者有iframe未切换
- 定位错元素了。
元素操作
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.select import Selectdriver = webdriver.Chrome()
# 浏览器窗体的最大化
driver.maximize_window()
# 设置窗体大小尺寸
driver.set_window_size(1000, 200)# 访问指定文件和url
driver.get(r'C:\Users\asus\Desktop\xxx.jpg')
driver.get('http://www.baidu.com')# 浏览器窗体的最小化
driver.minimize_window()# 浏览器的前进和后退,以及刷新
driver.forward()
driver.back()
driver.refresh()
# 获取title
print(driver.title)
# 元素定位
driver.find_element(定位方法,定位值)
# 页面中的元素操作都是基于元素获取之后才能够进行的。
# 输入和点击
driver.find_element('xpath', '//*[@id="form"]/span[1]/span[1]').click()
鼠标悬停
'''下拉列表框:现如今市场上基本都是基于input和div来实现的下拉列表框div,通过click来进行操作input下拉列表框:1. 通过click来进行操作(是推荐行为)2. 如果有readonly,就先remove掉,再通过send_keys输入(容易出现问题)select标签下拉列表框:是最为传统的形式,相对有年代感的系统才会存在。
'''
# select标签下拉列表框
select = Select(driver.find_element('id', 'deviceType'))
# 获取指定的值,进行选择
select.select_by_index(1)
select.select_by_value('11')
select.select_by_visible_text('自动驾驶')
# div下拉列表框与鼠标悬停
el = driver.find_element('xpath', '//span[text()="设置"]')
# 导入actionchains类进行悬停操作
ActionChains(driver).move_to_element(el).perform()
# 高级搜索
driver.find_element('link text', '高级搜索').click()
sleep(2)
driver.find_element('xpath', '//*[@id="adv-setting-gpc"]/div/div[1]').click()
sleep(1)
driver.find_element('xpath', '//p[text()="最近一月"]').click()
# 退出浏览器与进程,释放资源
driver.quit()
句柄和iframe
课程笔记
页面元素操作时,可能会遇到有的内嵌窗体,Iframe弹出新页面时,driver还是操作着原来的页面,是因为有句柄的存在一个页面 == 一个句柄操作新的页面,就需要切换到新的句柄,是一个固化的模式1. 获取所有句柄2. 切换到新的句柄PS:如果要关闭原有的标签页,操作新的页面:1. 获取所有句柄2. 关闭原有标签页3. 切换到新句柄PPS:在操作页面时,一定注意最多保留两个页面存在,不要超过两个
总结的笔记
iframe (要切换到iframe ,但是不能操作iframe外的东西了)
QQ登录成功后(iframe直接关闭的情况),如果还要继续操作,需要切换回原来的页面
切出iframe(iframe不关闭,类似这个弹窗关闭了),需要切出
# 完整代码
from time import sleepfrom selenium import webdriverdriver = webdriver.Chrome()
sleep(2)
driver.maximize_window()
# 进入QQ登录
driver.get('http://music.163.com')
driver.implicitly_wait(10)
driver.find_element('link text', '登录').click()
driver.find_element('link text', '选择其他登录模式').click()
driver.find_element('id', 'j-official-terms').click()
driver.find_element('link text', 'QQ登录').click()
sleep(2)
print(driver.title)
# 打印出来是网易云音乐的# 切换句柄
handles = driver.window_handles # 获取当前所有句柄
print(handles)# 关闭当前标签页
driver.close()
driver.switch_to.window(handles[1]) # 切换到新的句柄页
print(driver.title) # 打印出来的是“QQ帐号安全登录”# 切换到iframe:通过id,name直接切换iframe,也可以定位iframe元素,将元素作为参数传递
driver.switch_to.frame(driver.find_element('id', 'ptlogin_iframe'))
driver.find_element('id', 'img_out_508419907').click()
# 从iframe切换到默认内容
driver.switch_to.default_content()
sleep(1)
# 切换回原有句柄
driver.switch_to.window(handles[0])
sleep(1)
print(driver.title)
补充
selenium 4.0中(开启新的浏览器/不用切换句柄)
新增一个浏览器或者句柄页并且直接进行切换:通过参数来定义(tab,window)
driver.switch_to.new_window(‘tab’) # tab表示标签页,window表示浏览器
打开后新增了一个标签页,或者新的浏览器
默认聚焦第一个标签页,通过new_window后可直接操作该页面(并不用再做句柄的切换)
'''Selenium4.0新增的关于浏览器与标签页的管理new_window()函数只支持4.0及以上版本
'''
from time import sleepfrom selenium import webdriverdriver = webdriver.Chrome()
# handles = driver.window_handles
# print(handles)
# sleep(2)
# 新增一个浏览器或者句柄页并且直接进行切换:通过参数来定义(tab,window)
driver.switch_to.new_window('tab') # tab表示标签页,window表示浏览器
handles = driver.window_handles
print(handles)