Selenium三大切换的骚操作之显性等待

发表于:2019-9-25 11:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小公瑾    来源:博客园

  一、handle窗口切换
  当点击某个元素后,会重新生成一个新的页签,但此时我们的操作仍然在原先的窗口当中,如果要在新的窗口继续操作元素,那么就要用到handle窗口切换的方法。
  常用方法:
  window_handles:获取当前打开的所有窗口句柄,返回类型为一个列表。
  current_window_handle:获取当前窗口的句柄。
  switch_to.window(handle_path):切换窗口,handle_path参数代表的是一个窗口句柄。
  当操作某个元素后需要等待新的元素出现,我们用到了显性等待,EC给了我们一个方法为visibility_of_element_located(),表示元素可见,那么在handle窗口切换时也涉及到等待,那就是等待新的窗口打开,我将用一般方法和新的方法来展示,具体用法如下:
  方法一(使用time.sleep()强制等待):
   import time
  from selenium import webdriver
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.common.by import By
  driver = webdriver.Chrome()
  driver.get("http://www.baidu.com")
  driver.maximize_window()
  driver.find_element_by_id("kw").send_keys("python")
  driver.find_element_by_id("su").click()
  loc = (By.XPATH, "//a[text()=' 基础教程 | 菜鸟教程']")
  WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
  driver.find_element(*loc).click()   # 点击后新的窗口出现
  # 切换到新的窗口,在新窗口去操作元素
  time.sleep(1)  # 强制等待1秒
  # 1、获取当前打开的所有窗口。 --- 窗口列表。handles
  wins = driver.window_handles
  print(wins)
  # 打印打前窗口的句柄
  print(driver.current_window_handle)
  # 2、切换的语句 ,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
  driver.switch_to.window(wins[-1])
  # 3、在新的页面当中,找元素,并操作
  loc = (By.XPATH, "//ul[@class='pc-nav']//a[text()='首页']")
  WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
  driver.find_element(*loc).click()
   方法二(使用骚操作EC.new_window_is_opened()方法):
   from selenium import webdriver
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.common.by import By
  driver = webdriver.Chrome()
  driver.get("http://www.baidu.com")
  driver.maximize_window()
  driver.find_element_by_id("kw").send_keys("python")
  driver.find_element_by_id("su").click()
  loc = (By.XPATH, "//a[text()=' 基础教程 | 菜鸟教程']")
  WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
  cur_handles = driver.window_handles   # 点击操作之前的窗口总数为1
  driver.find_element(*loc).click()   # 点击后新的窗口出现
  # 等待一下,窗口总数会变成2个
  # 切换到新的窗口,在新窗口去操作元素。
  # Ec条件 -- 等待新窗口出现
  WebDriverWait(driver, 20).until(EC.new_window_is_opened(cur_handles))  # 更稳定的窗口等待
  # 再次获取窗口列表 。总数为2
  # 1、获取当前打开的所有窗口。 --- 窗口列表。handles
  wins = driver.window_handles
  print(wins)
  # 打印打前窗口的句柄
  print(driver.current_window_handle)
  # 2、切换的语句,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
  driver.switch_to.window(wins[-1])
  # 3、在新的页面当中,找元素,并操作。
  loc = (By.XPATH, "//ul[@class='pc-nav']//a[text()='首页']")
  WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
  driver.find_element(*loc).click()
  二、iframe切换
  iframe表示在主html上嵌入的子html页面如下图所示:
  当我们要在新的html页面操作元素,就要切换到新的html页面后才能进行接下来的操作,常用方法如下:
  switch_to.frame(path):切换到新的html页面,path支持下标、name、WebElement对象三种参数
  switch_to.default_content():切换到主html页面
  switch_to.parent_frame():切换到上一层html页面(父页面)
  在iframe切换中也有等待,除了使用time.sleep()方法外,EC给了我们一个方法为frame_to_be_available_and_switch_to_it(),表示iframe有效并切换到iframe当中,它支持下标、name、WebElement对象以及元组四种方法传参,两种方法如下:
  方法一(使用time.sleep()强制等待):
   import time
  from selenium import webdriver
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.common.by import By
  driver = webdriver.Chrome()
  driver.get("https://www.baidu.com")
  driver.maximize_window()
  driver.find_element_by_id("kw").send_keys("qq空间")
  driver.find_element_by_id("su").click()
  loc = (By.XPATH, "//a[text()='官网']/preceding-sibling::a[text()='-分享生活,留住感动']")
  WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
  cur_handles = driver.window_handles   # 点击操作之前的窗口总数为1
  driver.find_element(*loc).click()   # 点击后新的窗口出现
  # 等待一下,窗口总数会变成2个
  # 切换到新的窗口,在新窗口去操作元素。
  # Ec条件 -- 等待新窗口出现
  WebDriverWait(driver, 20).until(EC.new_window_is_opened(cur_handles))  # 更稳定的窗口等待
  # 再次获取窗口列表 。总数为2
  # 获取当前打开的所有窗口。 --- 窗口列表。handles
  wins = driver.window_handles
  # 切换的语句,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
  driver.switch_to.window(wins[-1])
  # 切换iframe
  driver.switch_to.frame("login_frame")
  time.sleep(1)  # 强制等待1秒
  driver.find_element_by_xpath("//div[@id='bottom_web']//a[text()='注册新帐号']").click()
  方法二(使用骚操作EC.frame_to_be_available_and_switch_to_it()方法):
   from selenium import webdriver
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.common.by import By
  driver = webdriver.Chrome()
  driver.get("https://www.baidu.com")
  driver.maximize_window()
  driver.find_element_by_id("kw").send_keys("qq空间")
  driver.find_element_by_id("su").click()
  loc = (By.XPATH, "//a[text()='官网']/preceding-sibling::a[text()='-分享生活,留住感动']")
  WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))
  cur_handles = driver.window_handles   # 点击操作之前的窗口总数为1
  driver.find_element(*loc).click()   # 点击后新的窗口出现
  # 等待一下,窗口总数会变成2个
  # 切换到新的窗口,在新窗口去操作元素。
  # Ec条件 -- 等待新窗口出现
  WebDriverWait(driver, 20).until(EC.new_window_is_opened(cur_handles))  # 更稳定的窗口等待
  # 再次获取窗口列表 。总数为2
  # 获取当前打开的所有窗口。 --- 窗口列表。handles
  wins = driver.window_handles
  # 切换的语句,切换到你想操作元素所在的窗口。进入到了新的html页面 - 新的窗口 wins[-1]
  driver.switch_to.window(wins[-1])
  # EC条件 - 等待iframe有效并切换到iframe当中
  WebDriverWait(driver, 20).until(
  EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@id="login_frame"]')))
  driver.find_element_by_xpath("//div[@id='bottom_web']//a[text()='注册新帐号']").click()
   三、alert弹框切换
  如何区分是alert弹框呢?一个简单的方法就是无法使用元素定位的弹框,并且需要优先处理后才能操作后面的元素,常用方法如下:
  switch_to.alert:切换到alert弹框
  accept():确定
  dismiss():取消
  send_keys(keysToSend) :输入文本,keysToSend表示输入的文本内容字符串
  text():获取弹出框里面的内容
  在EC里面也给alert弹框设定了一个方法,alert_is_present()方法表示等待alert弹框出现并切换到alert弹框中
  方法一(常规做法):
   from selenium import webdriver
  driver = webdriver.Chrome()
  driver.maximize_window()
  driver.get("http://XXXX")
  # 做一个操作,导致alert框出现
  driver.find_element_by_id("idxxx").click()
  # 切换到alert弹框
  alert = driver.switch_to.alert
  # 获取alert的文本内容
  print(alert.text)
  # 点击确定,关闭弹框
  alert.accept()
  方法二(使用骚操作EC.alert_is_present()方法):
    from selenium import webdriver
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  driver = webdriver.Chrome()
  driver.maximize_window()
  driver.get("http://XXXX")
  # 做一个操作,导致alert框出现
  driver.find_element_by_id("idxxx").click()
  # EC条件 -- 等待alert弹框出现,并切换到alert当中
  alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
  # 获取alert的文本内容
  print(alert.text)
  # 点击确定,关闭弹框
  alert.accept()

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号