【问题标题】:How to locate the Dynamic WebElement using WebDriver如何使用 WebDriver 定位动态 WebElement
【发布时间】:2013-11-18 17:50:05
【问题描述】:

自动化规范 - 基于 Java 的 WebDriver


我正在开发一个 webdriver 自动化(Java 代码)来自动预订巴士。
这是我的场景....

(1)give 出发地和目的地 - 完成
(2) 选择日期 - 完成
(3)搜索巴士 -DONE
(4)查看座位和选择 - 我在这里打了

现在,作为搜索结果,我得到了一个巴士列表,其中包含查看座位的选项。 公交车列表显示在 dynamic-DataTable 中,其中每行包含一个名为“view seat”的图像。单击 viewseat-image 将为我提供座位布局,我可以在其中选择 座位。发现viewseat-images具有不同的ID相同的类名。现在我需要使用它的 id 找到并单击我想要的viewseat-image。
但情况是
* 数据表是动态的,所以 id 不断变化,这不允许我通过静态 id 找到它。
* id 是该编码中唯一独特的东西,用于区分viewseat-image。所以只有当我得到正确的 id 时才能找到它。

现在我的想法是,获取所有viewseat-images的运行时ID,使用唯一的类名并存储在变量中,并使用ID来定位元素。
因此,让我知道是否有可能使用类名获取该数据表中所有图像的 id。

【问题讨论】:

  • 您是否尝试过使用不同的选择器而不是席位 ID? Xpath、CSS 等。如果您可以提供 html 代码 sn-p 作为您问题的一部分,它会更容易为您提供帮助。
  • 我试过了。但我只能在 HTML 中找到 ID 和类名。这是上面提到的viewseat-image的HTML代码。<a id="100001610410140976/2013-11-07" class="pop-up viewSeatsButtonStyle" href="javascript:void(0);">View seats</a>
  • 除了ID、名称、类名等还有其他选择器。有时您需要使用xpath 或css 的'uglier' 方法。如果您可以添加表格一部分的 html sn-p 而不仅仅是那个锚点,我可以尝试为您指明正确的方向。
  • 感谢@MarkRowlands。我也在寻找类名、名称、cssSelector。但找不到。我们的开发人员正在使用 hte DataTable 而不是 Grid View 来显示此列表。因此,如果提供表格的 HTML sn-p 对您来说太难了,因为它包含一个地狱 outa css 标记。所以我给你表格的概述。表包含 TRAVELS NAME、DEP TIME、ARRIV TIME、PRICE 等列,最后是 VIEWSEAT 图像。
  • 所以我只给你旅行运营商和 viewSeat 的 sn-p。 <a id="103838910410032127" class="cancel cancelonwards" name="2013-11-07" href="#" style="color:#4A5892;font-size:11px;font-family:Verdana;font-weight:200;">Canc.Policy</a> <a id="103838910410032127/2013-11-07" class="pop-up viewSeatsButtonStyle" href="javascript:void(0);">View seats</a>

标签: java automation webdriver selenium-webdriver ui-automation


【解决方案1】:

您可以使用绝对路径并获取座位的位置,这将减少您的工作量,要获取绝对路径您可以在Firefox中安装一个名为“firepath”的插件,安装后您将有一个选项可以选择绝对路径或相对路径。使用绝对路径,您无需使用 ID 来识别动态创建的元素。使用标签内元素的位置来标识路径。

绝对路径示例: //div/div/div/table/tbody/tr/td[2]/div/input[3]

【讨论】:

    【解决方案2】:
    List<WebElement> elements = driver.findElements(By.className("classname"));    
    
    for(WebElement ele : elements) {
        System.out.println(ele.getAttribute("id"));
    } 
    

    【讨论】:

      【解决方案3】:
      driver.findElement(By.xpath("//a[text()='View seats']")).get(index).click()
      

      你可以试试这个方法。但我不确定它是否可行。我正在寻找一种可以解决动态页面问题的通用方法。

      【讨论】:

        【解决方案4】:

        当动态数据表到来时,您可以在表中存储大小,例如:

         int size = driver.findElements(By.xpath("//*[@id='demo_ID']/tbody/tr")).size();
        

        并且可以设置一个循环来读取表格的每个可用行,或者您可以一一点击它们。喜欢:

        String strGetContent = text.getText();
        or
        text.click(); // As per your need 
        

        现在您可以阅读或单击表格的每一行,尽管行是动态出现的。希望对您有所帮助!

        如需更多解释或示例,我更喜欢:How to Automate a Dynamic page through Selenium Web Driver

        【讨论】:

          猜你喜欢
          • 2017-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多