Javascript 瓦蒂尔随机弹出窗口

Javascript 瓦蒂尔随机弹出窗口,javascript,html,ruby,cucumber,watir-webdriver,Javascript,Html,Ruby,Cucumber,Watir Webdriver,总之,我正在测试这个电子商务,我得到了一个随机弹出窗口(它是一个div),它阻碍了我的脚本,鉴于它的随机外观,我无法真正预测它将在何时显示,否则我可以很容易地与它交互,因为它是一个简单的div,无论何时我看到它。有没有一种方法可以让我抓住这个弹出窗口,并在它胆敢显示的时候随心所欲?提前谢谢 <div class="fsrFloatingMid"><div class="fsrInvite"> <div class="fsrDialogs"> <d

总之,我正在测试这个电子商务,我得到了一个随机弹出窗口(它是一个div),它阻碍了我的脚本,鉴于它的随机外观,我无法真正预测它将在何时显示,否则我可以很容易地与它交互,因为它是一个简单的div,无论何时我看到它。有没有一种方法可以让我抓住这个弹出窗口,并在它胆敢显示的时候随心所欲?提前谢谢

<div class="fsrFloatingMid"><div class="fsrInvite">
<div class="fsrDialogs">
    <div style="margin-left: 0px;" class="fsrDialog ">
        <div class="fsrLogos">
            <img src="/_ui/desktop/common/foresee/sitelogo.gif" alt="" class="fsrSiteLogo">
            <img src="/_ui/desktop/common/foresee/fsrlogo.gif" alt="Foresee" class="fsrCorpLogo">
        </div>
        <h1 class="fsrHeading">We'd welcome your feedback!</h1>
        <p class="fsrBlurb">Some bullshit text</p>
        <p class="fsrSubBlurb">The survey is designed to measure your entire experience, please look for it at the <u>conclusion</u> of your visit.</p>
        <p class="fsrAttribution">This survey is conducted by an independent company, on behalf of the site you are visiting.</p>
        <div style="" class="fsrB">
            <div class="fsrAcceptButtonContainer">
                <a href="javascript:void(0)" class="fsrAcceptButton" tabindex="2">Yes, I'll give feedback</a><span class="hidden-accessible">&nbsp;(this will launch a new window)</span>
            </div>

            <div class="fsrDeclineButtonContainer"><a href="javascript:void(0)" class="fsrDeclineButton"    tabindex="1">No, thanks</a>
            </div>
        </div>
        <div class="fsrFooter">
            <a href="http://some-bullshit-url" tabindex="5" title="Validate TRUSTe privacy certification" target="_blank" class="fsrTE"><img src="/_ui/desktop/common/foresee/truste.png" alt="TRUSTe verified" class="fsrTruste"></a>
        </div>
    </div>
</div>
<a href="#" role="button" tabindex="6" class="fsrCloseBtn">×<span class="hidden-accessible">Click to close.</span></a>

我们欢迎您的反馈!

一些废话文本

这项调查旨在衡量您的整个体验,请在访问结束时查看

此调查由一家独立公司代表您访问的网站进行

(这将启动一个新窗口)
@browser.link(类:“fsrCloseBtn”)。单击if@browser.h1(类:“hsrHeading”)。可见吗?

像这样的东西应该足够了。显然,无论您为
@browser
命名什么,都可以使用sub。如果对话框可见,则单击关闭链接;如果对话框不存在,则跳过此步骤。我的语法可能有点错误,所以请仔细检查。我习惯于将所有这些都包装到page对象中,看起来像:


page\u class.close\u dialog如果page\u class.dialog\u header\u元素可见?

如果此弹出窗口随机出现,则我认为使用“保护代理”设计模式将最有帮助。其目的是执行一段特定的代码,在我们的示例中:

if browser.div(class: 'fsrDialogs').exists?
      browser.a(class: 'fsrCloseBtn').click
end
在调用“subject”(subject是我们封装在代理类中的对象,在本例中是浏览器)上的任何方法之前。代理设计模式在Ruby中的实现非常简单,下面是我们在您的特定情况下的实现方式:

class WatirProxy
  attr_reader :subject
  def initialize(browser)
    @subject = browser
  end

  def method_missing(method, *args)
    puts "I am executing the code below before calling #{method} with args #{args}"
    if subject.div(class: 'fsrDialogs').exists?
      subject.a(class: 'fsrCloseBtn').click
    end

    subject.send(method, *args)
  end
end
您可以在生产中删除缺少的puts-below
方法
,但是,如果您不完全清楚下面的代码是如何工作的,我建议您暂时保留它

让我们试着玩一下:

browser = WatirProxy.new(Watir::Browser.new(:chrome)) # you can use ANY method on browser, although it's wrapped in a proxy
browser.goto 'https://google.com'
puts browser.text_field(name: 'q').exists?
Ruby应该输出:

I am executing the code below before calling goto with args ["https://google.com"]
I am executing the code below before calling text_field with args [{:name=>"q"}]
true # May change if google search box 'name' attribute changed to something other than 'q' in the future

在您的特定情况下,此弹出窗口会引发错误,因为浏览器没有预料到它,现在我们确保在调用浏览器上的任何方法之前进行检查。Russ Olsen写了一本关于代理设计模式(以及Ruby中其他一些有用的模式)的好书。

对Prevene survey也有同样的问题,我通过添加

 while browser.text.include?("We'd welcome your feedback!") == false do
   browser.refresh
   sleep 1
  end
 browser.link(:class => /declineButton/).click
end

转到页面后的第一步。这不是最好的选择,但它处理的是预见,因为一旦你关闭窗口,你会得到一个fsr cookie,它可以防止调查在浏览器会话期间再次弹出。添加“睡眠1”是为了让chrome放慢速度,寻找预见调查。希望有帮助。

它是应用程序中的弹出窗口还是浏览器中的弹出窗口(例如,安全警报)?如果是您的应用程序,那么您的开发人员可能能够知道是什么随机触发弹出窗口,以及它是否确实是有效的弹出窗口。你可能有一个
解救
,并在弹出窗口出现时处理它。谢谢你的回复。虽然我想找一些更干燥的东西,但无论如何,谢谢你把这个代码放在一个程序中,然后再做浏览器。如果你想要一行,请添加检查程序(&proc\u name)。你觉得这些信息有用吗?如果是,请接受此答案,谢谢。我恐怕它没有这样做,因为加载页面时弹出窗口不会显示,这是完全随机的,我感谢你的回答,尽管我恐怕我不能接受答案,因为它不能完全解决我的问题,尽管当你知道弹出窗口将在何时显示时非常有用,再次感谢如果这件事完全是随机的,那么我们必须走相反的路。这会阻止您执行浏览器方法,必须在执行任何方法之前进行检查。请参阅我关于如何完成此任务的最新答案。非常感谢你的帮助,伙计,我认为答案是正确的:)感谢你帮助我的努力