【问题标题】:Can't fill_in value because Capybara don't see popup无法填写值,因为 Capybara 看不到弹出窗口
【发布时间】:2018-09-16 08:10:07
【问题描述】:

据我所知,当弹出窗口/模式打开时,它位于我打开它的页面顶部,因此当尝试在其中填充值时,看不到它需要在哪里执行此操作。

然后尝试使用 within 查看模态框内部。尝试了其他类,但同样 Capybara::ElementNotFound: Unable to find visible css "modal183"

within('modal183') do
        fill_in 'ctl00_ContentPlaceHolder1_tbId', :with => '10'
      end

用xpath也试过了,但也没有 Capybara::ElementNotFound:找不到可见的 xpath "//input[@id='ctl00_ContentPlaceHolder1_tbId']"

<div class="modal183">
            <div class="popup_Titlebar" id="PopupHeader">
                <div class="TitlebarLeft">
                    <span id="ctl00_ContentPlaceHolder1_lblTitle">text</span>
                </div>
            </div>
            <div class="popup_Body">

                <div class="popup_TextNoTop">
                    <span id="ctl00_ContentPlaceHolder1_lbl1" class="label-left">text</span>
                    <input name="ctl00$ContentPlaceHolder1$tbId" type="text" id="ctl00_ContentPlaceHolder1_tbId" class="txtInputDec width100" onFocus="ClearTheTextbox(this, &#39;&#39;)" onBlur="FillTheTextbox(this, &#39;&#39;)" onkeypress="return onlyNumbers()" />
                    <span id="ctl00_ContentPlaceHolder1_cmrvIB" style="color:Red;display:none;"><a href='#' class='tooltipCons'><img src='/App_Themes/Default/img/exclamation.png' alt='' /><span>text</span></a></span>
                    <span id="ctl00_ContentPlaceHolder1_revIB" style="color:Red;display:none;"><a href='#' class='tooltipCons'><img src='/App_Themes/Default/img/exclamation.png' alt='' /><span>text
</span></a></span>
                    <span id="ctl00_ContentPlaceHolder1_rvTb" style="color:Red;display:none;"><a href='#' class='tooltipCons'><img src='/App_Themes/Default/img/exclamation.png' alt='' /><span>text</span></a></span>
                    <br />
                    <span id="ctl00_ContentPlaceHolder1_lbl2" class="label-left">text</span>
                    <input name="ctl00$ContentPlaceHolder1$tb1Id" type="text" id="ctl00_ContentPlaceHolder1_tb1Id" class="txtInputDec width100 top5" onFocus="ClearTheTextbox(this, &#39;&#39;)" onBlur="FillTheTextbox(this, &#39;&#39;)" onkeypress="return onlyNumbers()" />
                    <span id="ctl00_ContentPlaceHolder1_rev1IB" style="color:Red;display:none;"><a href='#' class='tooltipCons'><img src='/App_Themes/Default/img/exclamation.png' alt='' /><span>text
</span></a></span>
                    <span id="ctl00_ContentPlaceHolder1_rvTb1" style="color:Red;display:none;"><a href='#' class='tooltipCons'><img src='/App_Themes/Default/img/exclamation.png' alt='' /><span>text</span></a></span>
                </div>
            </div>
            <div class="popup_Buttons">
                <table width="100%" border="0" cellpadding="0" cellspacing="0">
                    <tr>
                        <td align="left">
                            <a onclick="if (!window.event) {this.disabled=true; this.style.color=&#39;grey&#39;; var but = document.getElementById(&#39;btnCancel&#39;); but.disabled=true; but.style.color=&#39;grey&#39;;};" id="ctl00_ContentPlaceHolder1_btnOkay" class="cool-button width80 blue" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$btnOkay&quot;, &quot;&quot;, true, &quot;cons&quot;, &quot;&quot;, false, true))">text</a>
                        </td>
                        <td align="right">
                            <a id="ctl00_ContentPlaceHolder1_btnCancel" class="cool-button width80 black" href="javascript:__doPostBack(&#39;ctl00$ContentPlaceHolder1$btnCancel&#39;,&#39;&#39;)">Atcelt</a>
                        </td>
                    </tr>
                </table>
            </div>
        </div>

已更新: 附加部分看起来像是我按下按钮后出现的这个弹出窗口。检查此代码上显示的代码。这段代码不是我写的,而是试图在它们上构建自动化测试:)

<div id="popupparent" style="display: block; height: 1e+06px; left: 0px; top: 0px;">
<script language="javascript" type="text/javascript">


    function resizeIframe(obj) {
        var h = "innerHeight" in window ? window.innerHeight : document.documentElement.offsetHeight;
        var w = "innerWidth" in window ? window.innerWidth : document.documentElement.offsetWidth;

        var doc;
        if (obj.contentDocument) {
            doc = obj.contentDocument;
        } else if (obj.contentWindow) {
            doc = obj.contentWindow.document;
        } else {
            return;
        }

        var childHeight = doc.body.scrollHeight;
        var childWidth = doc.body.scrollWidth;


        obj.style.height = childHeight + 'px';
        var ver = getInternetExplorerVersion();
        var parent = document.getElementById('termsofuse');

        if (ver > -1) {
            parent.style.marginTop = ((h - childHeight) / 2) - 64 + 'px';
        } else {
            parent.style.top = ((h - childHeight) / 2) - 64 + 'px';
        }

        parent.style.left = ((w - childWidth) / 2) + 'px';
        parent.style.display = "block";
        parent.style.visibility = "visible";
    }

<div id="termsofuse" style="left: 1081px; top: 246.5px; display: block; visibility: visible;">
<iframe id="frameeditexpanse" frameborder="0" src="PopDailyCons.aspx?e=c0lEPUMwMDEwMDA3MDQmYUlEPUEwMDQ3ODIxNzAmZGF5PTImY3VyRGF0ZT0yMDE4LjA0JmN1clVzZXI9MTYwJnNvdXJjZT1hdGs=" scrolling="no" marginheight="0" marginwidth="0" class="termsOfUseFrame" style="height: 185px;"> </iframe>
<div class="popup_Buttons" style="display: none">
            <input id="btnOk" value="Done" type="button">
            <input id="btnCancel" value="Cancel" type="button" onclick="hideusertermwindow()">


【问题讨论】:

    标签: ruby automation popup capybara


    【解决方案1】:

    您的within 调用不起作用,因为您需要向它传递一个 CSS 选择器。您正在传递modal183,它将查找&lt;modal183&gt; 元素,而您真正想要的是.modal183 以查找具有modal183 类的元素。

    根据您的描述,很难准确判断您在做什么,但听起来您可能正在谈论在当前选项卡顶部打开的弹出窗口(新浏览器窗口)。如果是这种情况,那么您需要交换窗口以便与它进行交互,按照

    new_win = window_opened_by do
      # whatever action in the original window causes the popup window to open
      click_button 'blah' 
    end
    
    within_window(new_win) do
      fill_in 'ctl00_ContentPlaceHolder1_tbId', :with => '10'
    end
    

    【讨论】:

    • 感谢您的回答,但收到错误“Capybara::WindowError: block 传递给#window_opened_by 打开 0 个窗口而不是 1 个”。找到需要增加Capybara.default_wait_time的信息,但是之后还是报这个错误
    • @MārisL 好的,这意味着它不是弹出窗口,您需要更新您的问题以明确您在做什么
    • 在我的情况下,弹出窗口不是新的浏览器窗口,而是像在页面前面打开的模式。背景就像父母,然后那个模态/弹出窗口就像孩子。不知道如何用其他方式解释。像这样的东西 --> w3schools.com/howto/howto_css_modals.asp 按“打开模式”
    • 在第一个问题的末尾附加了带有该弹出窗口的代码部分。也许这会有所帮助
    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2021-10-31
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多