Google chrome 使用Watir在Chrome中打开新选项卡会导致使用打开的选项卡出现问题

Google chrome 使用Watir在Chrome中打开新选项卡会导致使用打开的选项卡出现问题,google-chrome,pdf,tabs,watir-webdriver,selenium-chromedriver,Google Chrome,Pdf,Tabs,Watir Webdriver,Selenium Chromedriver,简短版本:Chrome中的新标签阻止了旧标签的使用,修复了这一问题,这意味着在人类检查PDF之前,打开的带有PDF的标签会被重新使用 长版本: 最初它是这样工作的: 打开应用程序主页的新Chrome窗口(选项卡1) 2.[执行流程A,然后]单击按钮,将打开一个新选项卡(选项卡2),其中包含PDF A 返回tab#1[执行流程B,然后]单击按钮,将打开一个新选项卡(tab#3),其中包含PDF B 返回tab#1[执行流程C,然后]单击按钮,打开一个新选项卡(tab#4),下载Word文档C文档

简短版本:Chrome中的新标签阻止了旧标签的使用,修复了这一问题,这意味着在人类检查PDF之前,打开的带有PDF的标签会被重新使用

长版本: 最初它是这样工作的:

  • 打开应用程序主页的新Chrome窗口(选项卡1) 2.[执行流程A,然后]单击按钮,将打开一个新选项卡(选项卡2),其中包含PDF A
  • 返回tab#1[执行流程B,然后]单击按钮,将打开一个新选项卡(tab#3),其中包含PDF B
  • 返回tab#1[执行流程C,然后]单击按钮,打开一个新选项卡(tab#4),下载Word文档C文档
  • 返回tab#1[执行流程D,然后]单击按钮,打开一个新选项卡(tab#5),下载Word文档D文档
  • 所有选项卡保持打开状态,可以查看PDF。不完美,但可行

    但后来情况发生了变化。我把常用的东西拿出来,放到另一个文件中的方法中,这样所有的各种测试都可以使用它们,这似乎是个好主意。但这似乎导致了人们对原始窗口失去关注的问题。(我可能错了)现在我陷入了:

  • 打开应用程序主页的新Chrome窗口(选项卡1)
  • [执行流程A,然后]单击按钮,将打开一个新选项卡(选项卡2),其中包含PDF A
  • 停留在tab#2[执行流程B,然后]单击按钮,将打开一个新选项卡(tab#3),其中包含PDF B。PDF A现已丢失
  • 停留在tab#3[执行流程C,然后]单击按钮,打开一个新选项卡(tab#4),下载Word文档C文档。PDF B现已丢失
  • 停留在tab#4[执行流程D,然后]单击按钮,一个新选项卡(tab#5)打开,Word文档D文档被下载
  • 这是使用“b.windows.last.use”造成的 所以我试着用“b.windows.first.use” 但这失败了,因为焦点不会返回到选项卡1,而且watir无法在模式中找到需要单击的对象。 (在“assert_ok”中:元素在点(737.5,-373)处不可单击(Selenium::WebDriver::Error::UnknownError))

    就我所知,如果我能做到以下任何一项,我都会很好

  • 获取PDF下载。我不能。看起来很有希望,但代码不起作用,我无法修复它
  • 让watir返回到第一页“for realsies”,并找到它需要的按钮
  • 也许为测试的每个部分都打开一个新的标签页(我将对此进行研究,但我不抱太大希望)
  • 有什么想法吗? 我在过去两个月内更新了Watir和Ruby。我在OSX上使用Chrome。移动到Windows或IE是不可行的选择

    下面是代码的一部分。不,首先我不是程序员

    谢谢

    currenturl = "stackoverflow.placeholder.com/works"    
    
    # print Inventory Report .PDF (document 1)
    b.goto currenturl
    b.div(:id, 'page').a(:text, 'Inventory Report').click 
    sleep 1
    b.div(:id, 'printInventoryReportModal').a(:text, 'A4').click
    b.link(:id => "submitBTNprint-inventory-report").fire_event "onclick"
    
    # print General List .PDF (document 2)
    b.goto [main page URL]
    b.div(:id, 'page').a(:text, 'General List').click 
    sleep 1
    b.div(:id, 'printGeneralInventoryListModal').a(:text, 'A4').click
    b.link(:id => "submitBTNprint-general-list").fire_event "onclick"
    
    # print General List .DOC (document 3)
    b.goto [main page URL]    
    b.div(:id, 'page').a(:text, 'General List').click 
    sleep 1
    b.div(:id, 'printGeneralInventoryListModal').a(:text, '.DOC').click
    b.div(:id, 'printGeneralInventoryListModal').a(:text, 'A4').click
    b.link(:id => "submitBTNprint-general-list").fire_event "onclick"
    

    大多数情况下,browser.window函数似乎没有按预期的方式工作,或者您没有正确使用它。由于您的问题目前很少涉及您如何尝试更改窗口(选项卡)的示例,因此很难判断您可能做错了什么

    首先,我将使用IRB进行一些探索和故障排除

    进入IRB,然后使用

    require 'watir-webdriver'
    b = Watir::Browser.new :chrome
    
    现在,手动导航打开的浏览器窗口,使其处于打开多个选项卡的状态

    现在,在IRB中尝试类似的方法,看看是否可以让它吐出窗口标题

    b.windows.each {|window| puts window.title}
    
    如果标题不同,那么您应该能够使用它来设置要使用的窗口。如果它们没有区别,那么您需要查看其他属性,看看是否有一种简单的方法来确定您想要哪个窗口。(或者只使用:index)

    尝试下面的代码

    睡眠(2)

  • 如果要切换回实际窗口,请使用 与上述代码相同,并相应更改窗口索引

  • 例如,如果父窗口索引为
    0
    ,而子窗口索引为
    1

    两件事,那么将其简化为调用常用帮助器方法的代码部分之一,然后还包括这些方法的代码可能会有所帮助。其次,我要指出的是,对于诸如print Inventory Report one之类的项目,我从未看到它被设置或使用过“currenturl”,但它正在将该变量(即变量中的值)传递给page_status和section_results方法。如果不提供来自helper方法的代码,很难获得完整的信息,很可能你会得到零答案。另外,对于打开的其他选项卡,是否可以使用一些有用的标题来允许.window方法正确定位所需的选项卡?这比使用.last和.first更不随意。要找到要使用Chuck的选项卡,首先:感谢您的输入。即使没有常用的helper方法,问题仍然存在,因此我将它们从上述代码中删除。为了完整起见,我为“currenturl”添加了一个占位符。至于标签的命名,我试着使用
    b.window(:title=>“tab\u name”)。使用do
    ,但也没有帮助。据我所知,它失败了,因为浏览器实际上没有将焦点更改回第一个/最后一个/指定的选项卡,并且没有焦点无法访问该页面上显示的模式。好的,但我在上面的代码中没有看到任何试图将浏览器窗口设置为指向其他选项卡的内容。。你也没有指出代码哪里出了差错,或者在什么时候开始出错等等。很难理解你的“错在哪里”。你说“PDF A现在丢失了”是什么意思?它怎么了?它不是还在表2中吗?当您提到“模态”时,您是指某种使用div实现的psuedo模态,还是真正的Javascript模态对话框(如JS警报)?
    @browser.driver.switch_to.window(@browser.driver.window_handles[put_your_index])
    @browser.window(:title,"Please put your title here").use do
    end
    @browser.button.when_present.click