Selenium入门学习----下拉框,滚动条等(三)
一、下拉框的操作
下拉框的操作就是选择我们需要用到的选项。如下图:
我们有时候需要完成这种操作。下拉框的操作我们一般用Select类。
Select类是Selenium为了操作select标签而特殊封装的。
-
思路分析:
-
导包。
from selenium.webdriver.support.ui import Select
-
实例化Select类。
Select(driver.find_element(By.ID,'s1Id'))
-
调用方法。有三种
select_by_index(index)
根据索引来定位 ,从0开始select_by_value(value)
根据value值来定位select_by_visible(text)
根据文本来定位
-
下面所有操作都基于这个HTML源码来操作:
先导入包:
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/selectTest.htm')
1、选中操作
# 先定位到下拉框元素
s1 = Select(driver.find_element(By.ID,'s1Id'))
# 选择选项。选择第一个o1
# 方法1:
s1.select_by_index(1) # 通过索引来定位。基于下标获取,下标从1开始
# 方法2:
s1.select_by_value('o1') #通过value值来定位
# 方法3:
s1.select_by_visible_text('o1') # 通过文本值来定位
sleep(1)
2、返回所有选项
for option in s1.options:
print(option.text)
3、返回被选中的选项
s1.select_by_visible_text('o1') # 通过文本值来定位
sleep(1)
# 返回所有被选中的选项
for option in s1.all_selected_options:
print(option.text)
完整源码:
from time import sleep
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/selectTest.htm')
# 先定位到下拉框元素
s1 = Select(driver.find_element(By.ID,'s1Id'))
# 选择选项。选择第一个o1
# 方法1:
s1.select_by_index(1) # 通过索引来定位
# 方法2:
s1.select_by_value('o1') #通过value值来定位
# # 方法3:
s1.select_by_visible_text('o1') # 通过文本值来定位
sleep(1)
# 返回所有选项
for option in s1.options:
print(option.text)
# 返回被选中的选项
for option in s1.all_selected_options:
print(option.text)
driver.quit()
4、取消选中操作
driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/selectTest.htm')
des1 = Select(driver.find_element(By.ID,'s1Id'))
# 根据index取消选中
des1.deselect_by_index(1)
sleep(1)
# 根据value取消选中
des1.deselect_by_value('o1')
sleep(1)
# 根据文本取消选中
des1.deselect_by_visible_text('o1')
sleep(1)
# 取消所有选项
des1.deselect_all()
driver.quit()
二、滚动条操作
1、竖向滚动操作(上下)
execute_script(“document.documentElement.scrollTop=xx”)
xx为设置的数值,0-10000。0表示最顶部,10000表示最底部
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element('id','kw').send_keys('selenium滚动条方法')
driver.find_element('id','su').click()
sleep(2)
driver.execute_script('document.documentElement.scrollTop=10000') # 滚动到最底部
sleep(3)
driver.execute_script('document.documentElement.scrollTop=0') # 滚动到顶部
sleep(3)
driver.quit()
2、横行滚动操作
横行滚动是通过控制坐标来实现的。scrollTo(x,y)
execute_script(scrollTo(x,y))
三、selenium元素的操作
1、浏览器操作
driver.maximize_window()
浏览器最大化
driver.set_window_size(2000, 2000)
浏览器尺寸的设置
driver.close()
关闭当前的标签页,后台进程依旧存在。
driver.quit()
用于结束driver进程
2、获取页面的标题信息
print(driver.title)
3、鼠标悬停
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
# 鼠标悬停。通过ActionChains类实现。过程中请勿操作光标
(ActionChains(driver).move_to_element(driver.find_element(
'xpath', '//span[text()="设置"]')).perform()) # perform方法表示执行的意思
sleep(2)
driver.find_element('xpath', '//span[text()="高级搜索"]').click()
sleep(5)
driver.quit()
四、多窗口切换
1、handles句柄
我们在用百度搜索资料的时候,有时候需要点击链接内容查看,这是就会新增一个窗口,这就是多窗口。
1、driver.current_window_handle
获取当前窗口
2、driver.window_handles
获取所有窗口
selenium在打开新的标签页后,实际句柄还是在最初第一个句柄页。(也就是在最初的窗口)。无法操作新的窗口,必须切换句柄才可以。
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.implicitly_wait(5)
# 窗口最大化
driver.maximize_window()
sleep(2)
driver.find_element('id', 'kw').send_keys('selenium学习')
sleep(2)
driver.find_element('id', 'su').click()
# 打开新的标签页
driver.find_element('xpath', '//*[@id="1"]/div/h3/a').click()
sleep(3)
print(driver.title) # 即使打开了新的句柄,这里输出的还是最初的句柄标题
# 切换句柄
handles = driver.window_handles # 通过window_handles,获取所有句柄的方式(即获取所有的窗口)
driver.close() #关闭旧的标签页
# 以列表的形式打印出所有句柄
print(handles) # ['4EB3B1169268CB655539F68F19F4A23C', '8C854A7DC612CF27FF3CD6F8DD4997E1']
driver.switch_to.window(handles[1]) # 切换到新的标签页
sleep(1)
print(driver.title)
sleep(5)
2、iframe内嵌窗体
在iframe中存在的元素,selenium是无法直接获取到的。所有在操作iframe的元素时,需要先切换到iframe才可以
红色框出的就是第一层iframe,绿色的就是第二层iframe
以下是源码操作:
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.implicitly_wait(5)
driver.get('http://mail.qq.com')
# 切换至iframe,以便于操作该iframe中的元素
driver.switch_to.frame(driver.find_element('xpath', '//div[@class="QQMailSdkTool_login_loginBox_qq"]/iframe'))
# 切换至第二层iframe
driver.switch_to.frame(driver.find_element('id', 'ptlogin_iframe'))
driver.find_element('link text', '注册账号').click()
driver.switch_to.default_content() # 切换回默认窗体,也就是最原始的html之中
sleep(20)
注意:iframe操作结束后,需要切换回来默认的状态,才可以操作iframe以外的内容。
3、浏览器操作行为
自动生成新的窗口或者浏览器
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(2)
# 在百度窗口基础上,创建新的标签(新的窗口)
# driver.switch_to.new_window('tab') # 创建新的标签页
driver.switch_to.new_window('window') # 创建新的浏览器
driver.get('https://mail.qq.com/')
sleep(3)
运行的结果如下:
1、切换新的标签
2、创建新的浏览器
五、三类等待
1、强制等待
强制等待是最简单也是最不推荐使用的一种等待方式。它通过直接暂停程序执行指定的时间长度,来等待网页上的元素变得可用或可见。
优点:
- 实现简单,容易理解。
缺点:
- 浪费时间:可能等待的时间远远超出了实际需要的时间。
- 缺乏灵活性:无法应对网页响应时间的变化,有时可能等待不足,有时又过度等待。
sleep(5)
time.sleep(1)
2、隐式等待
隐式等待是一种全局等待方式,只需要设置一次,Selenium WebDriver 会在查找所有元素时自动应用该等待。如果在指定的时间内未找到元素,Selenium会抛出一个NoSuchElementException
异常。
优点:
- 简单易用:设置一次,适用于后续所有的元素查找操作。
- 自动化:查找元素时,如果未立即找到,WebDriver会等待更长的时间直到超时,或元素出现。
缺点:
- 可能影响测试脚本的执行效率,因为每次查找元素时都会应用等待时间,即使元素已经可用。
driver.implicitly_wait(10) 隐式等待最大等待时间为5秒
3、显示等待
显示等待允许你为某个特定的条件设置等待时间,直到该条件成立。它通常与某些预期条件一起使用,例如检查元素是否可见、是否可点击等等。显式等待会返回等待的元素本身。
优点:
- 高效灵活:只有在需要时才等待,并且可以针对不同的元素设置不同的等待条件。
- 准确性高:能够更精确地等待特定条件的满足,而不是简单地等待固定的时间。
缺点:
- 实现相对复杂:需要写更多的代码来指定等待条件。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
try:
element = WebDriverWait(driver, 10).until(driver.find_element(By.ID, "someId"))
finally:
driver.quit()