• Web自动化测试——Selenium处理alert/confirm/prompt提示框



    Selenium处理alert/confirm/prompt提示框


    About
    回到顶部

    重新认识alert
    首先,不是所有的alert都能叫做alert框。
    JavaScript中,关于消息提示框的方法有三个(虽然都跟alert差不多):

    • alert(message)方法用于显示带有一条指定消息和一个 OK 按钮的警告框。
    • confirm(message)方法用于显示一个带有指定消息和 OK 及取消按钮的对话框。如果用户点击确定按钮,则 confirm() 返回 true。如果点击取消按钮,则 confirm() 返回 false。
    • prompt(text,defaultText)方法用于显示可提示用户进行输入的对话框。如果用户单击提示框的取消按钮,则返回 null。如果用户单击确认按钮,则返回输入字段当前显示的文本。

    来看个示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>alert</title>
    </head>
    <body>
    

    <input type="button" id="alertButton" value="alert" onclick="alertButton()">
    <input type="button" id="confirmButton" value="confirm" onclick="confirmButton()">
    <input type="button" id="promptButton" value="prompt" onclick="promptButton()">
    <script>

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">alertButton</span>(<span class="hljs-params"></span>) </span>{
        alert(<span class="hljs-string">'我是普通的alert提示框'</span>);
    };
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">confirmButton</span>(<span class="hljs-params"></span>) </span>{
        <span class="hljs-keyword">var</span> msg = confirm(<span class="hljs-string">'点击[确定]或者[取消]按钮'</span>);
        <span class="hljs-keyword">if</span> (msg) {
            alert(<span class="hljs-string">'你点击的是[确定按钮]'</span>);
        } <span class="hljs-keyword">else</span> {
            alert(<span class="hljs-string">'你点击的是[取消按钮]'</span>);
        }
    };
    
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">promptButton</span>(<span class="hljs-params"></span>) </span>{
        <span class="hljs-keyword">var</span> msg = prompt(<span class="hljs-string">'输入一个值:'</span>, <span class="hljs-string">'我是默认值'</span>);
        <span class="hljs-keyword">if</span> (msg) {
            alert(<span class="hljs-string">'输入的值为:
    '</span> + msg);
        } <span class="hljs-keyword">else</span> {
            alert(<span class="hljs-string">'输入值为空'</span>);
        }
    };
    

    </script>
    </body>
    </html>

    selenium如何处理?
    selenium操作上面三种提示框有以下几种方法:

    • alertObject.text:获取提示的文本值。
    • alertObject.accept():点击『确认』按钮。
    • alertObject.dismiss():点击『取消』或者叉掉对话框。
    • alertObject.send_keys(message):输入文本,仅适用于prompt方法,因为alert和confirm的提示框没有输入框!!!并且,如果在非prompt类型的提示框使用alertObject.send_keys(message),会报错!

    whatever,因为这些消息提示框的特性,我们『检查 or F12』都无法选中提示框。所以,selenium在处理起来,首先要经过一个switch_to的过程。
    另外,当你看到提示框只有提示信息和一个确定按钮时,它就是alert提示框;当你看到提示框中有提示信息和确定/取消按钮都在时,它就是confirm提示框;当你看到提示信息和input框,并且确定和取消按钮都在时,它就是prompt提示框。
    至于,为什么不提提示框中右上角的叉掉图标,这是根据浏览器的不同,有的有这个图标,有的没有,比如Chrome和Firefox就没有,而IE就有。

    selenium处理alert提示框
    回到顶部

    selenium在处理alert时,要经过:

    1. switch_to.alert方法将webdriver作用域切换到alert提示框上。
    2. 现在,我们可以使用text获取提示文本信息、accept()点击确认按钮、dismiss()点击取消或者叉掉提示框。
    import time
    from selenium import webdriver
    

    driver = webdriver.Chrome()
    try:

    driver.get(url=<span class="hljs-string">'file:///M:/tests.html'</span>)
    time.sleep(<span class="hljs-number">2</span>)
    driver.find_element_by_id(<span class="hljs-string">'alertButton'</span>).click()
    time.sleep(<span class="hljs-number">1</span>)
    <span class="hljs-comment"># alertObject = driver.switch_to_alert()   # 不要使用这个方法了,因为该方法即将被弃用,当然,暂时还是可以使用,或者selenium版本较低也可以使用。</span>
    alertObject = driver.switch_to.alert  <span class="hljs-comment"># 这里,alert方法不加括号,以为该方法被 @property 伪装成属性了,具体参考源码</span>
    print(alertObject.text)  <span class="hljs-comment"># text方法也被 @property 伪装成属性了</span>
    alertObject.accept()  <span class="hljs-comment"># 点击确定按钮</span>
    
    time.sleep(<span class="hljs-number">2</span>)
    driver.find_element_by_id(<span class="hljs-string">'alertButton'</span>).click()
    time.sleep(<span class="hljs-number">1</span>)
    alertObject = driver.switch_to.alert
    time.sleep(<span class="hljs-number">2</span>)
    alertObject.dismiss()  <span class="hljs-comment"># 叉掉提示框</span>
    
    time.sleep(<span class="hljs-number">2</span>)
    driver.find_element_by_id(<span class="hljs-string">'alertButton'</span>).click()
    time.sleep(<span class="hljs-number">1</span>)
    alertObject = driver.switch_to.alert
    alertObject.send_keys(<span class="hljs-string">'这一行会报错'</span>)  <span class="hljs-comment"># selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: User dialog does not have a text box input field.</span>
    

    finally:
    time.sleep(10)
    driver.quit()

    由最后的报错可以看到,alert提示框中不能使用alertObject.send_keys(message)方法。

    selenium处理confirm提示框
    回到顶部

    selenium在处理confirm时,与处理alert一样:

    1. switch_to.alert方法将webdriver作用域切换到alert提示框上。
    2. 现在,我们可以使用text获取提示文本信息、accept()点击确认按钮、dismiss()点击取消或者叉掉提示框。
    import time
    from selenium import webdriver
    

    driver = webdriver.Chrome()
    try:

    driver.get(url=<span class="hljs-string">'file:///M:/tests.html'</span>)
    time.sleep(<span class="hljs-number">2</span>)
    driver.find_element_by_id(<span class="hljs-string">'confirmButton'</span>).click()
    time.sleep(<span class="hljs-number">1</span>)
    alertObject = driver.switch_to.alert
    print(alertObject.text)  <span class="hljs-comment"># 打印提示信息</span>
    time.sleep(<span class="hljs-number">1</span>)
    alertObject.accept()  <span class="hljs-comment"># 点击确定按钮</span>
    time.sleep(<span class="hljs-number">1</span>)
    alertObject.accept()  <span class="hljs-comment"># 根据前端js代码逻辑,当点击确定按钮后会再弹出一个提示框,我们再次点击确定</span>
    time.sleep(<span class="hljs-number">2</span>)
    driver.find_element_by_id(<span class="hljs-string">'confirmButton'</span>).click()
    time.sleep(<span class="hljs-number">1</span>)
    alertObject = driver.switch_to.alert
    alertObject.send_keys(<span class="hljs-string">'这一行会报错'</span>)  <span class="hljs-comment"># selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: User dialog does not have a text box input field.</span>
    

    finally:
    time.sleep(10)
    driver.quit()

    同样的,confirm提示框中也不能使用alertObject.send_keys(message)方法。

    selenium处理prompt提示框
    回到顶部

    selenium在处理prompt时,与处理alert/confirm一样:

    1. switch_to.alert方法将webdriver作用域切换到alert提示框上。
    2. 现在,我们可以使用text获取提示文本信息、accept()点击确认按钮、dismiss()点击取消或者叉掉提示框。
    3. 现在可以使用alertObject.send_keys(message)方法了。
    import time
    from selenium import webdriver
    

    driver = webdriver.Chrome()
    try:

    driver.get(url=<span class="hljs-string">'file:///M:/tests.html'</span>)
    time.sleep(<span class="hljs-number">2</span>)
    driver.find_element_by_id(<span class="hljs-string">'promptButton'</span>).click()
    time.sleep(<span class="hljs-number">1</span>)
    alertObject = driver.switch_to.alert
    print(alertObject.text)  <span class="hljs-comment"># 打印提示信息</span>
    time.sleep(<span class="hljs-number">1</span>)
    alertObject.send_keys(<span class="hljs-string">'send keys msg'</span>)
    print(alertObject.text)  <span class="hljs-comment"># 打印提示信息</span>
    alertObject.accept()  <span class="hljs-comment"># 点击确定按钮</span>
    print(alertObject.text)  <span class="hljs-comment"># 打印提示信息</span>
    time.sleep(<span class="hljs-number">1</span>)
    alertObject.accept()  <span class="hljs-comment"># 根据前端js代码,当点击确定按钮后会再弹出一个提示框,我们再次点击确定</span>
    time.sleep(<span class="hljs-number">2</span>)
    driver.find_element_by_id(<span class="hljs-string">'promptButton'</span>).click()
    time.sleep(<span class="hljs-number">1</span>)
    alertObject = driver.switch_to.alert
    alertObject.send_keys(<span class="hljs-string">''</span>)
    time.sleep(<span class="hljs-number">1</span>)
    alertObject.dismiss()  <span class="hljs-comment"># 什么都不管,直接点击取消,会在弹出一个提示框</span>
    time.sleep(<span class="hljs-number">1</span>)
    <span class="hljs-comment"># 现在弹出的是一个普通的提示框,点击确定和取消都无所谓,具体根据业务场景来决定</span>
    <span class="hljs-comment"># alertObject.accept()</span>
    alertObject.dismiss()
    

    finally:

    time.sleep(<span class="hljs-number">10</span>)
    driver.quit()
    

    在prompt提示框中,要看到input框才能send keys!

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    Testdisk 操作指南(硬盘分区表恢复)
    ThinkPHP下使用Uploadify插件提示HTTP Error (302)错误的解决办法
    C#获取计算机CPU的温度
    C# 获取显示器的物理尺寸或分辨率
    获取windows 操作系统下的硬件或操作系统信息等
    AD CS relay attack
    内网密码收集[Foxmail]解密
    如果你是业务线的程序员
    浅析php curl_multi_*系列函数进行批量http请求
    memcached讲解
  • 原文地址:https://www.cnblogs.com/huoxc/p/12874096.html
Copyright © 2020-2023  润新知