Watir随机弹出窗口

时间:2014-09-17 04:12:23

标签: javascript html ruby cucumber watir-webdriver

很高,我正在测试这个电子商务,我得到了这个随机的弹出窗口(它是一个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>

3 个答案:

答案 0 :(得分:1)

如果这个弹出窗口随机出现,那么我认为使用“保护代理”设计模式对大多数人都有帮助。它的目的是执行一段特定的代码,在我们的示例中:

if browser.div(class: 'fsrDialogs').exists?
      browser.a(class: 'fsrCloseBtn').click
end

在“subject”上的任何方法之前(“subject”是我们在Proxy类中包装的对象,在我们的例子中它是浏览器)被调用。代理设计模式在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

您可以删除生产中method_missing以下的放置,但是,如果您不能100%清楚以下代码的工作原理,我建议您暂时保留它。

让我们试试吧:

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

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

答案 1 :(得分:0)

@browser.link(class: "fsrCloseBtn").click if @browser.h1(class: "hsrHeading").visible?

这样的事情应该足够了。显然,无论你为@browser的WebDriver实例命名什么。如果对话框可见,则单击关闭链接,如果对话框不存在,则跳过此步骤。我的语法可能有点不对,所以仔细检查一下。我习惯在page-object中包装所有这些,如下所示:

page_class.close_dialog if page_class.dialog_header_element.visible?

答案 2 :(得分:0)

与Foresee调查有同样的问题,我通过添加

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

转到页面后的第一步。它不是最佳选择,但它处理Foresee,因为一旦关闭窗口,您将获得一个fsr cookie,以防止调查在该浏览器会话期间再次弹出。 &#34;睡眠1&#34;添加,因此铬会减慢并寻找Foresee调查。希望它有所帮助。