【问题标题】:Finding xpath location on a new window, opened after click. Using java, and selenium在新窗口中查找 xpath 位置,单击后打开。使用 java 和 selenium
【发布时间】:2019-07-02 00:47:21
【问题描述】:

我正在通过使用 java 和 selenium 练习 UI 自动化测试。我的目标是以最有效的方式定位网络元素。

下面的代码是我用来查找 (xpath) 位置并在可见性后单击活动链接的代码。

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(path))).click();

单击后,我应该在新场景中找到另一个 Web 元素。通常,如果网页将我引导到同一窗口中的下一个场景,则此代码很有帮助。

当单击导致新窗口打开时,我的代码因“TimeoutException”而失败。我试图找到方法,但我正在工作的网页随机改变了方式。有时下一页出现在同一个窗口中,有时会打开新窗口。

有没有合适的方法来解决这类问题?

【问题讨论】:

  • 你试过处理新窗口吗?
  • 您描述的场景不清楚。您是说脚本在完全相同的链接上执行完全相同的步骤,并且是否打开新窗口不一致?更多描述,也许一些屏幕截图,也许一些 HTML 将有助于澄清。
  • 如果打开了新的窗口或标签,需要将驱动切换到新的窗口/标签。

标签: java selenium xpath


【解决方案1】:

您的应用程序中必须存在一些条件,使其在相同或不同窗口中打开新页面。

第一个任务是确定该条件。由于您的 Web 元素不可见,因此在等待显式等待中给出的预配置时间后会引发异常。

第二个,然后是

  1. 如果它是同一个窗口,它会有点简单,因为没有窗口可以切换到。您可以使用显式等待,就像我们对第一个元素所做的那样。
  2. 如果它在新窗口中打开,请尝试切换到该窗口,然后执行您的操作。 Selenium 提供了这种支持。请参阅以下链接:Link

【讨论】:

    【解决方案2】:

    你应该使用'handler'来管理窗口。

    一些网络应用程序有很多框架或多个窗口。一旦 WebDriver 对象被实例化,Selenium WebDriver 就会为每个窗口分配一个字母数字 id。这个唯一的字母数字 id 称为窗口句柄。 Selenium 使用这个唯一的 id 在多个窗口之间切换控制。简单来说,每个唯一的窗口都有一个唯一的 ID,以便 Selenium 在将控件从一个窗口切换到另一个窗口时可以区分。

    GetWindowHandle 命令 目的:获取当前窗口的窗口句柄。

    String  handle= driver.getWindowHandle();//Return a string of alphanumeric window handle
    

    GetWindowHandles 命令 目的:获取当前所有窗口的窗口句柄。

    Set<String> handle= driver.getWindowHandles();//Return a set of window handle
    

    切换到窗口命令 目的:WebDriver 支持使用“switchTo”方法在命名窗口之间移动。

     driver.switchTo().window("windowName");
    

    或者

    或者,您可以将“窗口句柄”传递给“switchTo().window()”方法。知道了这一点,就可以像这样遍历每个打开的窗口:

    for (String handle : driver.getWindowHandles()) {
    
    driver.switchTo().window(handle);}
    

    或者

    使用迭代器在窗口之间切换:

     driver.findElement(By.id(“id of the link which opens new window”)).click();
    
     //wait till two windows are not opened
    
     waitForNumberofWindowsToEqual(2);//this method is for wait
    
     Set handles = driver.getWindowHandles();
    
     firstWinHandle = driver.getWindowHandle(); handles.remove(firstWinHandle);
    
     String winHandle=handles.iterator().next();
    
     if (winHandle!=firstWinHandle){
    
     //To retrieve the handle of second window, extracting the handle which does not match to first window handle
    
     secondWinHandle=winHandle; //Storing handle of second window handle
    
    //Switch control to new window
    
     driver.switchTo().window(secondWinHandle);
    

    详情请看:https://www.toolsqa.com/selenium-webdriver/switch-commands/

    【讨论】:

    • 感谢您的意见和链接。我对 Selenium 的窗口处理方面非常陌生,并且仍在练习。这将是我学习的一个很好的来源。我尝试的是登录我的帐户并更新它。我这样做是为了更流畅地使用 Selenium 并练习使用更有效的 xpath 位置。我已经在我拥有帐户的几个网页中尝试过这个。由于我在问题中提到的原因,其中一些更难。也感谢您的所有回复。
    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 2015-09-09
    • 2013-08-10
    • 2021-12-14
    • 2020-04-16
    • 2015-11-15
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多