selenium wait 和 iframe
还是从朋友那个小事儿做的时候弄出来的问题
- selenium 如何切换driver到一个ID设置为中文iframe?
- 遇到alert了怎么处理?
- 检查某个元素是不是出现了?
不要问我为啥id会用中文,说多了都是泪,总之这是一个一言难尽的问题,一句话,国有企业你懂的。
- 切换到特定的iframe/frame
driver.switch_to_frame(driver.find_element_by_id('some_id'))
这样就可以在这个frame/iframe里做相应的find element操作了,但是要记住操作完了要切换回来
driver.switch_to_default_content()
多层嵌套的iframe也没有问题,只要一步一步的切换进去就好了
- 接受alert
一个简单的方法就是预计有alert的地方,写上接受就好了
driver.switch_to.alert.accept()
这样很粗暴,但是也很有效,精细一些的做法看文档,比如:
- 确认或者取消
from selenium.webdriver.common.alert import Alert
Alert(driver).accept()
Alert(driver).dismiss()
- 读取alert的文字内容
Alert(driver).text
- 认证的用户名和密码
driver.switch_to.alert.authenticate(username,password)
- 输入内容
name_prompt = Alert(driver) name_prompt.send_keys(“Willian Shakesphere”)
name_prompt.accept()
- 检查某个元素是否出现
以前的一个很粗暴的做法是time.sleep(N)
,但是这种情况下非常粗旷,selenium 提供了更精细的一些控制方法
- 等待某个元素出现以后获取这个元素
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10) #10秒,超过这个时间就会raise Exception
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))
- 这里的expected_conditions可以是下面的这些条件
- title_is
- title_contains
- presence_of_element_located #元素可以找到
- visibility_of_element_located #元素可见
- visibility_of
- presence_of_all_elements_located #所有元素可以被找到
- text_to_be_present_in_element #元素中包含text
- text_to_be_present_in_element_value #元素的value值包含text
- frame_to_be_available_and_switch_to_it #iframe可以切换
- invisibility_of_element_located #不可见元素被找到
- element_to_be_clickable #不但可见,而且可点
- staleness_of
- element_to_be_selected #元素被选中
- element_located_to_be_selected #
- element_selection_state_to_be
- element_located_selection_state_to_be
- alert_is_present #弹框出现
这些基本覆盖了常见的情况了,足够用了,记得处理异常,否则就挂了。
Last modified on 2016-11-17