1、元素等待
元素等待分别有三种:强制等待、隐藏等待、显示等待。
1.1 强制等待
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
# 打开Chrome浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 请求 百度
driver.get("https://www.baidu.com")
# 输入需要搜索的数据
driver.find_element(By.ID,'kw').send_keys("Python Web自动化测试")
# 强制等待时间为 3 秒
sleep(3)
driver.find_element(By.ID,'su').click()
# 强制等待 3 秒退出
sleep(3)
# driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
driver.quit()
1.2 隐藏等待
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开Chrome浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 请求 百度
driver.get("https://www.baidu.com")
# 输入需要搜索的数据
driver.find_element(By.ID,'kw').send_keys("Python Web自动化测试")
# 隐藏等待时间为 30 秒,默认是 0
driver.implicitly_wait(30)
driver.find_element(By.ID,'su').click()
# driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
driver.quit()
注意:使用隐藏等待,如果超时后,仍然没有找到元素,系统会抛异常。
1.3 显示等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 打开Chrome浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 请求 百度
driver.get("https://www.baidu.com/")
# 显示等待使用 WebDriverWait(driver,时间,每个时间).until(EC.presence_of_element_located(定位元素代码))
WebDriverWait(driver,3,0.5).until(EC.presence_of_element_located((By.ID,'kw'))).send_keys("126网易邮箱")
driver.find_element(By.ID,'su').click()
# driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
driver.quit()
2、表单切换
表单切换分别为:单表单、嵌套表单、平行表单。
2.1 单表单切换
可以找到页面元素 iframe 标签进行操作
切换与退出方法
driver.switch_to.frame(‘iframe的id与名字选一即可’)
driver.switch_to.default_content()
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开Chrome浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 请求 百度
driver.get("https://mail.sina.com.cn/")
# 切换 iframe 标签
driver.switch_to.frame('ckctlFrame')
driver.find_element(By.ID,'freename').send_keys('kasthsoft@sina.com')
driver.find_element(By.ID,'freepassword').send_keys('password')
driver.find_element(By.LINK_TEXT,'登录').click()
# 退出 iframe 标签
driver.switch_to.default_content()
# driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
driver.quit()
# 打开Chrome浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://mail.qq.com/")
# 切换 iframe 标签
driver.switch_to.frame('login_frame')
driver.find_element(By.ID,'u').send_keys('807002272')
driver.find_element(By.ID,'p').send_keys('password')
driver.find_element(By.ID,'login_button').click()
# 退出 iframe 标签
driver.switch_to.default_content()
# driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
driver.quit()
2.2 嵌套表单切换
注意:这里表现要从第一标签开始进行切换,这样才能正常找到标签,否则会报错。
这里没有找到可以演示网站,直接运行代码会报错,可以参考代码举一反三。
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开Chrome浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 先切换最外层 iframe 标签
driver.switch_to.frame('iframe1')
# 再切换到第二或第三 iframe 标签
driver.switch_to.frame('iframe2')
driver.switch_to.frame('iframe3')
driver.find_element(By.ID,'xxx').send_keys('xxxxx')
2.3 平行表单切换
注意:平行表单切换,找到了 iframe 1 标签后,需要先退出,然后切换到 iframe 2 标签 操作元素。
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开Chrome浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://mail.qq.com/")
# 切换 微信登录 iframe 标签
driver.switch_to.frame('login_wx_iframe')
# 退出 微信 iframe 标签
driver.switch_to.default_content()
# 切换 QQ 登录 iframe 标签
driver.switch_to.frame('login_frame')
driver.find_element(By.ID,'u').send_keys('807002272')
driver.find_element(By.ID,'p').send_keys('password')
driver.find_element(By.ID,'login_button').click()
# 退出 QQ iframe 标签
driver.switch_to.default_content()
# driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
driver.quit()
2.4 表单特殊情况处理
表单特殊情况是指,iframe 没有固定 id 与 name。
注意: 无法精准定位的时候,建议使用 By.XPATH 定位方法。
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开Chrome浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://126.com/")
# 使用 By.XPATH 获取元素
xpath = driver.find_element(By.XPATH ,'//div[@id="loginDiv"]/iframe')
# 将获取 iframe 元素切换
driver.switch_to.frame(xpath)
# 输入账号
driver.find_element(By.NAME,'email').send_keys('kasthsoft')
# 输入密码
driver.find_element(By.NAME,'password').send_keys('password')
driver.find_element(By.ID,'dologin').click()
# 退出 iframe 标签
driver.switch_to.default_content()
# driver.close()关闭驱动,driver.quit()退出驱动,开发中一般建议使用driver.quit()
driver.quit()