web页面-页面操作-窗口/iframe/alert切换

本文详细介绍了在网页自动化测试中如何进行窗口、iframe和alert的切换操作。针对元素找不到的问题,提出了可能的原因,如定位表达式错误、等待时间不足等。在窗口切换部分强调了设置等待时间的重要性;在iframe切换中通过实例展示了两种定位方法;在alert切换中,解释了在弹窗出现后如何正确处理以继续操作。

元素找不到可能的原因:

  • 元素定位的表达式不对
  • 没有设置等待,或者设置等待时间太少
  • 根本不在这个页面(另外一个窗口,在一个iframe当中)

最好不要用的值定位元素:

  • 属性值中有数字,数字可能会变化
  • 不认识的莫名其妙的字符串(加密),也有可能动态生成
  • class里面的active hidden 

1.窗口切换

窗口切换后要注意设置时间等待,否则会报错

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as when


class TestDeom:
    def test_01(self):
        with webdriver.Chrome() as browser:
            browser.get('http://baidu.com/')
            # browser.implicitly_wait(5)
            el = browser.find_element(By.XPATH, '//input[@id="kw"]')
            el.send_keys('柠檬班')
            search_button = browser.find_element(By.ID, 'su')
            search_button.click()
            # 设置显性等级
            # 1.等待器,设置倒计时
            # 2.等待条件出现
            # 3.在超时前,如果等待条件出现了,如果等待条件没有出现,会报超时错误
            wait = WebDriverWait(browser, timeout=10)
            # 注意等待某个元素是传入元组或列表
            condition = when.element_to_be_clickable((By.LINK_TEXT, 'lemon.ke.qq.com/'))
            lemon_link = wait.until(condition)
            # 打印切换窗口前的第一个窗口
            print(browser.current_window_handle)
            lemon_link.click()
            # 打印所有窗口
            print(browser.window_handles)
            # 切换到新页面,因为是列表,所以要选择最后一个
            browser.switch_to.window(browser.window_handles[-1])
            print(browser.current_window_handle)
            browser.find_element(By.CSS_SELECTOR, '.agency-content')

 运行结果:

2.iframe切换

例子一:

新建一个html文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>py44</title>
</head>
<body>
<!--    标题-->
    <h2 id="hello">hello</h2>
    <iframe id="i" name="f" src="http://testingpai.com" width="800px" height="600px"></iframe>
</form>
</body>
</html>

 然后找到本地编写html文件的路径,来访问

 iframe切换代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as when


class TestDeom:
    def test_01(self):
        with webdriver.Chrome() as browser:
            browser.implicitly_wait(5)
            browser.get('file:///E:/lemon/lianxi/day33_selenuim/iframe.html')
            browser.find_element(By.ID, 'hello')
            iframe = browser.find_element(By.ID, 'i')
            browser.switch_to.frame(iframe)
            browser.find_element(By.XPATH, '//span[contains(text(),"排行榜")]')

运行结果:

例子二:

还有一种定位元素的方式:#login_container>iframe,先定位到父级,再用>连接定位子级

 代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By


class TestDeom:
    def test_01(self):
        with webdriver.Chrome() as browser:
            browser.implicitly_wait(5)
            browser.get('https://v4.ketangpai.com/Home/User/login.html')
            browser.find_element(By.LINK_TEXT, '微信登录').click()
            iframe = browser.find_element(By.CSS_SELECTOR, '#login_container>iframe')
            # iframe = browser.find_element(By.XPATH, '//iframe')
            browser.switch_to.frame(iframe)
            qrcode = browser.find_element(By.CSS_SELECTOR, '.qrcode')
            print(f'微信二维码:{qrcode.get_attribute("src")}')

运行结果:

总结:

切换到子页面

iframe = browser.find_element(元素表达式)
browser.switch_to.frame(iframe)

切换到子页面的子页面

sub_iframe = browser.find_element(元素表达式)
browser.switch_to.frame(sub_iframe)

切换到父级页面

browser.switch_to.parent_frame()

切换到主页面

browser.switch_to.default_content()

3.alert切换

出现alert弹框后,再去定位主页面的元素就不管用了,所以我们要切换到alert当中,点击确定回到主页面,这样就可以定位主页面的元素了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>py44</title>
</head>
<body>
<!--    标题-->
    <h2 id="hello" onclick="alert('are you ok?')">hello</h2>
</body>
</html>

from selenium.webdriver import Chrome


class TestAlert:
    def testalert(self):
        url = 'E:\lemon\lianxi\day33_selenuim\iframe.html'
        with Chrome() as browser:
            browser.get(url)
            browser.find_element('id', 'hello').click()
            # 注意alert是个属性,不是方法,后面没有括号
            browser.switch_to.alert.accept()
            browser.find_element('id', 'hello')

 运行结果:

还有一种弹框跟alert相似,但实现方式不是原生的alert,可以直接进行元素定位

实现弹框的方式:

  • 原生的alert,prompt,样式很丑,所以现在用的少
  • 框架vue.js实现了ui效果,弹框就是普通的元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值