很高,我正在测试这个电子商务,我得到了这个随机的弹出窗口(它是一个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"> (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>
答案 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调查。希望它有所帮助。