【问题标题】:How to switch to a new tab in Jmeter Selenium using Javascript Interpreter?如何使用 Javascript 解释器切换到 Jmeter Selenium 中的新选项卡?
【发布时间】:2018-08-29 13:39:56
【问题描述】:

我正在使用 Jmeter 中的 javascript 编写硒测试。当我单击网站上的链接时,默认情况下它会在新选项卡中打开。自动浏览器甚至切换到这个新标签。但是,似乎 selenium 没有切换到新标签。当我在单击链接后打印 body 元素的内部 HTML(由 xpath //body 获得)时,我会返回第一个选项卡的源代码,而不是第二个选项卡。

当我尝试等待下一页上的任何元素时(例如,等待//div[@id="my-div-on-second-page-only"]),我得到一个超时,说该元素从未被找到(在我看到页面完成加载很久之后) .

我确实遇到了this question,但它是针对 python 的,我也很难理解接受的答案。

更新

我的标签切换代码目前如下所示:

// Switch tabs
var tabs = WDS.browser.getWindowHandles();
var tab = WDS.browser.getWindowHandle();
WDS.log.info("Tabs: " + tabs + " current: " + tab); // Output below

// Assume always there are only two tabs
for (t in tabs)
{
    WDS.log.info("Checking tab " + t);
    if (t != tab)
    {
        WDS.log.info("Switching to " + t);
        WDS.browser.switchTo().window(t);
        break;
    }
}

标有// Output below 的行的输出是:

Tabs: [CDwindow-A83928D86BA4F6F46C5D7F4B63B674A5, CDwindow-177CF406C98C28DF4AF5E7EC3228B896] current: CDwindow-A83928D86BA4F6F46C5D7F4B63B674A5

我什至没有进入 for/in 循环。我曾尝试使用tabs[index]tabs.get(0);tabs.iterator.next(); 进行切换,但都没有奏效。我整天都在网上搜索WDS.browser.getWindowHandles();返回的数据类型的一些信息,但似乎找不到。

更新 2

我最终切换到了 Java 解释器。所提出的解决方案,即使是 javascript 中的解决方案,都没有奏效。我怀疑javascript解释器本身存在问题。我将保留这个问题,以防有人愿意提供经过测试并在 Jmeter webdriver 扩展中工作的解决方案以供将来了解。

以下是我的工作 Java 代码。它使用 Matias Dominguez 的示例,假设tabs 中的最后一个条目是新选项卡。虽然我发现 Mike Cook 的解决方案似乎是一般解决方案的最佳解决方案,但 Matias 的解决方案足以解决我的问题。

// Switch tabs
ArrayList tabs = new ArrayList(); // Jmeter interpreter uses <String> by default
tabs.addAll(WDS.browser.getWindowHandles());
String tab = WDS.browser.getWindowHandle();
WDS.log.info("Tabs: " + tabs + " current: " + tab + " Size of tabs: " + tabs.size());
WDS.browser.switchTo().window(tabs.get(tabs.size() - 1));
WDS.log.info("Tabs switched successfully");

【问题讨论】:

  • 我在谷歌上找到了这个:softpost.org/selenium-with-node-js/…
  • 虽然窗口可能在视觉上聚焦在新选项卡上,但您的驱动程序仍在原始窗口句柄的上下文中工作。这可能因浏览器而异,但您通常必须在您想要与新句柄交互时明确指示驱动程序切换窗口句柄。
  • 你能用你的代码试验更新问题吗?
  • 不是重复的。这是专门关于 javascript 的。那是关于java的。

标签: javascript selenium jmeter uitest


【解决方案1】:

我会在单击操作之前加载一个包含所有窗口句柄的列表。那么点击后新窗口将不等于任何保存的窗口句柄值。

List<String> tabs = new ArrayList<>();
tabs.addAll(driver().getWindowHandles());
String newTab = null;

targetElement.click();

for (String currentWindow: driver().getWindowHandles()) {
    if (!tabs.contains(currentWindow)) {
        newTab = currentWindow;
        break;
    }
}

【讨论】:

    【解决方案2】:

    当您单击链接并打开一个新选项卡时,驱动程序仍将注意力集中在第一个选项卡上,因此您必须移动到它:

    List<String> tabs = new ArrayList<>();
    tabs.addAll(driver().getWindowHandles());
    driver().switchTo().window(tabs.size() - 1);
    

    这会获取所有窗口句柄并移动到最后打开的选项卡,然后您可以找到(theElement)。

    【讨论】:

    • 假设新打开的选项卡位于 ArrayList 中索引为 1 的位置是危险的。如果驱动程序已经包含超过 2 个 WindowHandles(窗口/选项卡),则新选项卡将放置在例如索引 2 上。改为从 ArrayList 中获取最后一个元素。
    • 好点,但我不想给出完整的解释,另一种方法是遍历所有句柄并匹配 driver().getTitle() (如果你知道的话)。
    • 我在这个测试中使用了 javascript,并且在从 getWindowHandles() 返回的任何类型的对象中提取窗口时遇到了一些麻烦。我试过tabs[0]tabs.get(0)tabs.iterator.next(),但似乎没有任何效果。
    【解决方案3】:

    您可以执行以下操作。

    var full_tabs = WDS.browser.getWindowHandles();
    var x = full_tabs.toString();
    var arr = x.split(',');
    var newtab = arr[arr.length-1].split(']').toString().replace(',','').replace(' ','');
    

    这不是最好的解决方案,但它会起作用。您可以将其合并为 2 行。

    【讨论】:

      【解决方案4】:

      您可以调用以下方法在标签之间切换:

      public void setMainWindow() {
          try{
              int numberOfWindow = driver.getWindowHandles().size();
              boolean tmpIndex = true;
      
              String mainWindowHandler = driver.getWindowHandle();        // Store the current window handle
              if (numberOfWindow > 1) {
                  for(String winHandle : driver.getWindowHandles()){
                      driver.switchTo().window(winHandle);                // Switch to new window opened
                      if (tmpIndex) {
                          mainWindowHandler = winHandle;
                      }
                      tmpIndex = false;
                  }
      
                                                                          // Perform the necessary actions on new window          
                  driver.close();                                         // Close the new window, if that window no more required
                  driver.switchTo().window(mainWindowHandler);            // Switch back to original browser (first window)
              }
          } catch (Exception e) {}
      }
      
      // Continue with original browser (first window)...
      

      【讨论】:

        猜你喜欢
        • 2020-08-10
        • 2015-04-27
        • 2017-11-15
        • 2019-07-01
        • 2017-04-20
        • 2018-12-15
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        相关资源
        最近更新 更多