• selenium中的元素操作之三大切换(二)


    一、窗口切换

    使用方法:

    1、获取到打开的所有的窗口,句柄handles

    all_handles = driver.window_handles

    print(all_handles)

    2、获取当前的窗口

    driver.current_window_handle

    print(driver.current_window_handle)

    3、利用切换的语句,切换到想要操作的窗口(HTML页面)

    # 获取到的所有窗口为一个列表,用索引取值

    driver.switch_to.window(all_handles[-1])

    举例说明:

    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
    import time
    
    
    # 创建一个Chrome会话
    driver = webdriver.Chrome()
    # 访问百度首页
    driver.get("http://baidu.com")
    
    wait = WebDriverWait(driver, 20)
    # 定位输入框,并输入“腾讯课堂”进行搜索
    driver.find_element_by_id('kw').send_keys("腾讯课堂")
    # 点击搜索按钮
    driver.find_element_by_id('su').click()
    # 满足以下条件,才会进行下一步
    loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
    wait.until(EC.visibility_of_element_located(loc))
    driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click()  # 出现了新的HTML页面
    time.sleep(2)
    
    # 获取所有的窗口,句柄
    all_handles = driver.window_handles
    # 切换到新打开的窗口
    driver.switch_to.window(all_handles[-1])
    
    # 在新的页面中找元素,并操作。
    # 找到登录的元素,并点击登录的按钮
    loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
    wait.until(EC.visibility_of_element_located(loc))
    driver.find_element(*loc).click()
    time.sleep(2)
    
    # 关闭浏览器
    driver.quit()

    上述的方法在新窗口出现之后,需要有一个强制的等待页面加载的时间time.sleep(2),这样是为了保证在页面未加载出来去点击,导致程序报错。我们采用的是强制等待的方式;那么在这里有一个小小的骚操作,在expected_conditions文件中,有一个new_window_is_opened类,等待新窗口的出现;该类调用时要传入一个current_handles的参数,功能为:所有的窗口句柄>current_handles,结果为True,条件成立。这个骚操作主要是为了替代强制等待这种方法,当然两种方法都可以用。

    骚操作举例说明:

    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
    import time
    
    
    # 创建一个Chrome会话
    driver = webdriver.Chrome()
    # 访问百度首页
    driver.get("http://baidu.com")
    
    wait = WebDriverWait(driver, 20)
    # 定位输入框,并输入“腾讯课堂”进行搜索
    driver.find_element_by_id('kw').send_keys("腾讯课堂")
    # 点击搜索按钮
    driver.find_element_by_id('su').click()
    # 满足以下条件,才会进行下一步
    loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
    wait.until(EC.visibility_of_element_located(loc))
    
    
    # 在新的窗口出现之前,获取窗口列表,这时窗口数为1
    cur_handles = driver.window_handles
    driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click()  # 出现了新的HTML页面
    # 出现新的窗口之后,窗口数为2,2>1,条件为True
    wait.until(EC.new_window_is_opened(cur_handles))
    # 再次获取所有的窗口
    # 获取所有的窗口,句柄 all_handles = driver.window_handles # 切换到新打开的窗口 driver.switch_to.window(all_handles[-1]) # 在新的页面中找元素,并操作。 # 找到登录的元素,并点击登录的按钮 loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]') wait.until(EC.visibility_of_element_located(loc)) driver.find_element(*loc).click() time.sleep(2) # 关闭浏览器 driver.quit()

     二、iframe切换

    切换的条件:如果你要操作的元素,在iframe当中, 你才需要切换
    页面元素(容器)-里面是一个HTML页面

    iframe定位方式    driver.switch_to.frame()
        index,下标
            driver.switch_to.frame(3)
        name属性
            driver.switch_to.frame("name属性的值")
        webelement对象
            driver.switch_to.frame(driver.find_element_by_xpath('xpath表达式'))
                支持selenium中8中定位方法
        嵌套的iframe
            driver.switch_to.frame()
        直接返回main页面
            driver.switch_to.default_content()
        切换到父级iframe
            driver.switch_to.parent_frame()

    举例说明:以登录腾讯课堂为例

    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
    import time
    
    
    # 实例化webdriver中的Chome对象
    driver = webdriver.Chrome()
    # 访问腾讯课堂
    driver.get('https://ke.qq.com/')
    
    # 查找登录按钮,设置等待条件
    loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
    # 找到找到登录的元素在进行下一步操作,查找时间上限为10秒
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
    # 找到元素,并点击
    driver.find_element(*loc).click()
    time.sleep(3)
    
    # 点击QQ登录,等待元素被找到进行下一步
    loc = (By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]')
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
    driver.find_element_by_xpath('//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
    time.sleep(1)
    
    # iframe切换方式一:通过下标、name属性、webelement对象进行切换
    # 弹出一个iframe登录框,定位iframe框 driver.switch_to.frame('login_frame_qq') # 使用显性等待 loc = (By.ID, 'switcher_plogin') WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc)) # 查找用账号密码登录元素 driver.find_element(*loc).click() time.sleep(0.5) # 输入账号 driver.find_element_by_id('u').send_keys("xxxx") # 输入密码 driver.find_element_by_id('p').send_keys('xxxxx') driver.find_element_by_id('login_button').click() time.sleep(3) # 退出 driver.quit()

     iframe骚操作:

     1 from selenium import webdriver
     2 from selenium.webdriver.support.wait import WebDriverWait
     3 from selenium.webdriver.support import expected_conditions as EC
     4 from selenium.webdriver.common.by import By
     5 import time
     6 
     7 
     8 # 创建一个Chrome对象
     9 driver = webdriver.Chrome()
    10 # 窗口最大化
    11 driver.maximize_window()
    12 # 访问腾讯课堂
    13 driver.get('https://ke.qq.com/')
    14 
    15 # 定位登录按钮,并点击操作,利用显示等待
    16 loc = (By.ID, 'js_login')
    17 WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
    18 driver.find_element_by_id('js_login').click()
    19 
    20 # 定位QQ登录按钮,并点击操作,显示等待
    21 loc = (By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]')
    22 WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
    23 driver.find_element(*loc).click()
    24 time.sleep(1)
    25 
    26 # iframe切换方式二:下标、name属性、webelement对象、元素定位元组四种
    27 # iframe骚操作,EC条件中,frame_to_be_available_and_switch_to_it这个条件,说明iframe有效并切换到iframe中
    28 # 切换到登录的iframe页面中
    29 WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@name="login_frame_qq"]')))
    30 driver.find_element_by_id('switcher_plogin').click()
    31 time.sleep(1)
    32 # 定位输入框,输入账户名、密码
    33 driver.find_element_by_id('u').send_keys('xxx')
    34 driver.find_element_by_id('p').send_keys('xxx')
    35 # 点击登录按钮
    36 driver.find_element_by_id('login_button').click()
    37 time.sleep(3)
    38 
    39 # 关闭浏览器
    40 driver.quit()

     alert弹框:

    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    # 创建一个Chrome会话
    driver = webdriver.Chrome()
    # 访问某网站
    driver.get("http://xxx.com")
    # 做一个操作,出现alert弹窗
    driver.find_element_by_id('xxx').click()
    
    
    # 方式一:
    # 切换到alert弹窗
    alert_1 = driver.switch_to.alert
    
    # 方式二(骚操作):
    # EC条件,alert弹框已出现,并切换到alert弹框中
    alert_2 = WebDriverWait(driver, 10).until(EC.alert_is_present())
    
    
    # 三种弹框,分别的操作方式
    # 点击确定,关闭弹窗
    alert_1.accept()
    alert_2.accept()
    # 点击取消
    alert_1.dismiss()
    alert_2.dismiss()
    # 输入文本内容
    alert_1.send_keys('xxx')
    alert_2.send_keys('xxx')
    
    # 关闭浏览器
    driver.quit()

    JavaScript三种弹框方式:https://www.w3school.com.cn/js/js_popup.asp

  • 相关阅读:
    使用jQuery淡入淡出HTML文本效果
    php一个诡异而简单的错误
    Android Tasker应用之自动查询并显示话费流量套餐信息
    ListView在应用开发中较为常用的做法
    网址收藏(网页制作源码下载网址、后台源码下载网址、域名注册网址)
    Flex4事件的监听与发布
    收拾心情,安安静静的学习
    ASP.NET development sever 在Windows server 2008/Vista显示页面无法找到 [转帖]
    花点时间搞清top、postop、scrolltop、scrollHeight、offsetHeight[转帖]
    HTTP 错误 401.2 Unauthorized 由于身份验证头无效,您无权查看此页。 IIS7.0解决办法
  • 原文地址:https://www.cnblogs.com/xingyunqiu/p/11517973.html
Copyright © 2020-2023  润新知