【问题标题】:How to get the tag Names from the HTML in selenium webdriver如何从 selenium webdriver 中的 HTML 获取标签名称
【发布时间】:2013-05-24 04:18:07
【问题描述】:

我想获取所有 Travels 名称的名称,出现在标签中,(它们是动态的,所以想要在数组中进行计数) 在http://www.redbus.in/Booking/SelectBus.aspx?fromCityId=124&fromCityName=Hyderabad&toCityId=462&toCityName=Mumbai&doj=30-May-2013&busType=Any&opId=0

这是html文件的一部分

<div id="t1-results">
<table id="t1-list5" class="list5" cellspacing="0" cellpadding="0" style="margin-top:0px;">
 <tbody id="t1-0">
 <tr class="r1">
 <td class="i1">Akbar Travels</td>
 <td class="i2">
 <td class="i3">
 <td class="i4">
 <td class="i5">
 <td class="i6">
 <td class="i7">
  </tr>
 <tr class="r2">
 <tr class="r3">
 </tbody>
 <tbody class="hrblank">
 <tbody id="t1-1" class="G">
 <tr class="r1">
 <td class="i1">Omer Travels</td>
 <td class="i2">
 <td class="i3">
 <td class="i4">
 <td class="i5">
 <td class="i6">
 <td class="i7">
 </tr>
 <tr class="r2">
 <tr class="r3">
 </tbody>
 <tbody class="hrblank">
 <tbody id="t1-2">
 <tr class="r1">
 <td class="i1">Sangita Travel Agency</td>
 <td class="i2">
 <td class="i3">
 <td class="i4">
 <td class="i5">
 <td class="i6">
 <td class="i7">
 </tr>

我试过了

        List<WebElement> linkElements = driver.findElements(By.tagName("//table[@cellspacing=\"0\"]"));

        String[] linkTexts = new String[linkElements.size()];

当我调试时得到linkElements ArrayList<E> (id=82)
linkTexts String[0] (id=95)

不工作。

也试过了

List<WebElement> linkElements = driver.findElements(By.tagName("t1-results"));

        String[] linkTexts = new String[linkElements.size()];

谁能告诉我如何取名字。

【问题讨论】:

  • 我相信你的问题不在于识别元素;您需要的是遍历返回的列表并从每个列表中提取字符串。请参阅下面 Marlon Bernardes 的回答,了解一些说明如何遍历列表的代码。

标签: java selenium-webdriver


【解决方案1】:

尝试使用 CSS 选择器,如下所示:

List<WebElement> linkElements = driver.findElements(By.cssSelector("table tr.r1 > td.i1")); 

我刚刚做了一个快速测试,这段代码找到了所有 63 个匹配项(在撰写本文时):

driver.get("http://www.redbus.in/Booking/SelectBus.aspx?fromCityId=124&fromCityName=Hyderabad&toCityId=462&toCityName=Mumbai&doj=30-May-2013&busType=Any&opId=0");

//Find's the elements using a CSS selector: all td's (with class "i1"), directly inside a tr (with class r1) which are inside a table.
List<WebElement> linkElements = driver.findElements(By.cssSelector("table tr.r1 > td.i1"));
String[] linksText = new String[linkElements.size()];
int index = 0;
for(WebElement element : linkElements){
    linksText[index++] = element.getText();
}

【讨论】:

  • 如果效果很好,您可以考虑接受答案,对吧? :)
【解决方案2】:

Xpath 也是不错的选择,用这个希望对你有帮助。

List<WebElement> linkElements = driver.findElements(By.Xpath("Your Xpath"));
String[] linksText = new String[linkElements.size()];
int index = 0;
for(WebElement element : linkElements){  
linksText[index++] = element.getText();
}

【讨论】:

  • Xpath 选择器通常很脆弱:对 DOM 的轻微更改可能会导致您的选择器无法按预期工作或根本无法工作。首选的选择器顺序是:Id/name > css > xpath。
  • 实际上我花了很多时间在 Xpath 上,但对 CSS 选择器一无所知,请查看以下链接 ejohn.org/blog/xpath-css-selectors John 清楚地提到,“要意识到的最重要的事情是 CSS 选择器通常是, 很短——但与 XPath 相比,动力不足”。
  • Selenium 建议不要使用 XPath,因为没有实现 Xpath 功能的浏览器可能会出现奇怪的问题。检查这些链接:docs.seleniumhq.org/docs/03_webdriver.jsp#by-xpathstackoverflow.com/questions/13975595/…
【解决方案3】:

尝试使用下面给出的 CSS 计数概念

int size=driver.findElements(By.cssSelector("#t1-results > #t1-list5 > tbody > tr.r1")).size();
for(int i=1;i<=size();i++)
{
    String travelname = driver.findElement(By.cssSelector("#t1-results > #t1-list5 > tbody > tr.r1 > td.i1"))
}

让我知道上面的脚本是否适合你。

【讨论】:

    【解决方案4】:

    CSS 和 XPath 条目都可用于解决此类问题,但需要进行一些说明:

    1. 某些 CSS 条目与经常更改的样式功能相关,不应用作定位器,
    2. 将 XPath 定位器整体描述为“脆弱”可以追溯到过去,当时该术语暗示了父级 /html 和正在寻找的最终小部件之间的完整 DOM 路径。

    存在用于构造 XPath 定位器的算法,这些算法首先被设计为根据频繁/大规模的 DOM 重组而变得健壮——这样的定位器绝不是脆弱的。

    不幸的是,前面提到的最后一个问题(某些浏览器 [特别是 IE] 具有非标准的 XPath 实现)是正确的,无论您对 XPath 的一般价值的看法如何。

    这不是放弃将 XPath 作为工具包的工具的理由 —— 但它可能会让人相信放弃具有如此多专有功能的浏览器。

    【讨论】:

      猜你喜欢
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2012-03-30
      • 2017-05-09
      • 1970-01-01
      • 2011-03-19
      相关资源
      最近更新 更多