selenium wait 和 iframe

还是从朋友那个小事儿做的时候弄出来的问题

  1. selenium 如何切换driver到一个ID设置为中文iframe?
  2. 遇到alert了怎么处理?
  3. 检查某个元素是不是出现了?

不要问我为啥id会用中文,说多了都是泪,总之这是一个一言难尽的问题,一句话,国有企业你懂的。

  1. 切换到特定的iframe/frame
driver.switch_to_frame(driver.find_element_by_id('some_id'))

这样就可以在这个frame/iframe里做相应的find element操作了,但是要记住操作完了要切换回来

driver.switch_to_default_content()

多层嵌套的iframe也没有问题,只要一步一步的切换进去就好了

  1. 接受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()

  1. 检查某个元素是否出现

以前的一个很粗暴的做法是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