1)什么是多表单?
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面
2)处理方法
直接使用id值切换进表单
driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表单元素,再切换进入
el = driver.find_element_by_xxx(value) driver.switch_to.frame(el) /driver.switch_to_frame(el)
案例: QQ空间:https://qzone.qq.com/ 126网站登录:https://www.126.com/ (需要谷歌的操作)
1) 进入到弹出框中 driver.switch_to.alert
2) 接收警告 accept()
3) 解散警告 dismiss()
4) 发送文本到警告框 send_keys(data)
滚动条操作
js = ‘window.scrollTo(0,b)‘ #b表示距离定位的距离
driver.execute_script(js) #执行js脚本 滚动条回到顶部
js = "window.scrollTo(0,0)"或者 js=“var q=document.documentElement.scrollTop=0
“ 滚动条回到底部
js = “window.scrollTo(0,document.body.scrollHeight)”或者 js="var q=document.documentElement.scrollTop=10000
“ 滚动条拉到指定位置(具体元素):--最常用
target = driver.find_element_by_id(“id_keypair”) #定位移动到的元素 driver.execute_script("arguments[0].scrollIntoView();", target)
1)鼠标操作
导入动作链类,动作链可以储存鼠标的动作
from selenium.webdriver import ActionChains 获取元素 el = driver.find_element_by_xxx(value)
context_click(el) 对el执行右击 执行ActionChains中储存的所有动作 perform()
ActionChains(driver).context_click(ele).perform() 点击鼠标右键 ActionChains(driver). click(ele).perform() 点击鼠标左键 ActionChains(driver).move_to_element(el).perform() 鼠标悬停
1)键盘操作 键盘操作使用的是Keys类,一般配合send_keys使用
导入 from selenium.webdriver.common.keys import Keys
常用键盘操作 send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A) send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X) send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
send_keys(Keys.F12) 键盘 F12
1) 为什么要进行等待?
1.网速慢 2.网站内容过多 3.如果不进行等待而直接定位元素,可能会抛出异常
2) selenium中等待的分类: 强制等待 显示等待 隐式等待
导入定时等待库
from time import sleep 或者 import time
time.sleep(10) # 表示强行等待10s在执行下一句代码 这种等待方式时间到了就会执行下个语句,但比较死板,不能保证在等待的时间内元素真正被加载了出来。而且如果等待的元素已经被加载出来,还需要等待到时间才会执行下一句,浪费时间。
driver.implicitly_wait(30) #等待30s
这个等待表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。 这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。
注:隐式等待的作用域是全局,所以一般设置在整局代码的头几行。 隐式等待采用全部设置,也就是说,你所有的findElement方法都会最多等待30s
需要导入的包 from selenium.webdriver.support.wait import WebDriverWait #导入显性等待的包 from selenium.webdriver.support import expected_conditions as EC #判断所需要的元素是否已经被加载出来 from selenium.webdriver.common.by import By #定位
WebDriverWait类是由WebDirver 提供的等待方法。显示等待明确的要等到某个元素的出现,在设置时间内每隔x秒去判断一下指定的元素是否加载完,加载完了就执行下一步,否则继续每隔x秒去判断,指定时间截止。如果超时就会抛出异常。
例如:WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,"g-hu")))
强制等待:傻瓜式等待,不智能 隐式等待:全局通用,只需设置一次,很智能(等到了就走,不会浪费时间) 显式等待:等待元素处于特定条件的时候使用,很智能(等到了就走,不会浪费时间)
访问12306从北京到武汉