使用xpath仅查找网页上的必需链接

时间:2015-05-27 20:54:24

标签: xpath selenium-webdriver contains

我的网页在网页上有超过一百个链接。我试图看看我是否只能存储所需数量的网络链接并将它们存储在一个数组中并运行一个循环来验证每个链接中的数据。

链接数是动态的,并根据用户进行更改,因此每次加载页面时都必须找到指定的链接。

这是我目前在for循环下为每个用户提供的内容:

List<WebElement> linksize = driver.findElements(By.xpath(obj.getProperty("totalbookings"))); 
int linksCount = linksize.size();
String[] linksENR = null;
linksENR = new String[linksCount];
System.out.println(linksCount);
if (linksCount > 0)
{
System.out.println("We have enrollment");
System.out.println(linksCount);
for (int i = 1; i <= linksCount; i++)
{
driver.navigate().to(linksENR[i]);
System.out.println("here");
}
}
else
{
System.out.println("No enrollment record found");
}

我试图为用户1点击的元素的xpath是,并且有一个元素:

.//*[@id='006g0000007RH1V_00Nb0000009Yc1K_body']/table/tbody/tr[2]/th/a

我尝试为用户2点击的元素的xpath如下所示,有两个元素:

.//*[@id='006g0000007RH1V_00Nb0000009Yc1K_body']/table/tbody/tr[2]/th/a
.//*[@id='006g0000007RH1V_00Nb0000009Yc1K_body']/table/tbody/tr[3]/th/a

这是我用xpath搜索的内容:

totalbookings = .//*[contains(@id, "7RH1V_00Nb0000009Yc1K_body") and contains(@tagName , "a")]

输出:

 No enrollment record found

是否可以通过xpath唯一识别少数选定的链接?请协助。

以下是元素的HTML信息:

     <table class="list" cellspacing="0" cellpadding="0" border="0">
<tbody>
    <tr class="headerRow"></tr>
    <!--

     ListRow 

    -->
    <tr class="dataRow even first" onmouseover="if (window.hiOn){hiOn(this);}" onmouseout="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}" onblur="if (window.hiOff){hiOff(this);}">
        <td class="actionColumn"></td>
        <th class=" dataCell " scope="row">
            <a class=" firepath-matching-node" href="/a1Bg0000001ih6M"></a>
        </th>
        <td class=" dataCell CurrencyElement"></td>
        <td class=" dataCell "></td>
        <td class=" dataCell "></td>
        <td class=" dataCell "></td>
        <td class=" dataCell numericalColumn"></td>
        <td class=" dataCell "></td>
    </tr>
    <!--

     ListRow 

    -->
    <tr class="dataRow odd last" onmouseover="if (window.hiOn){hiOn(this);}" onmouseout="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}" onblur="if (window.hiOff){hiOff(this);}"></tr>
    </tbody>

</table>

2 个答案:

答案 0 :(得分:0)

我会更喜欢这样做:

List<WebElement> pl = driver.findElements(By.xpath(".//a[contains(@id,'totalbookings')]")); 
if (pl.size() > 0)
{
  System.out.println("We have enrollment. Looping through links...");
  for ( WebElement we : pl )
  {
    we.click();
    System.out.println("Clicked link: " + we.toString() );
    thisPageObject.verifyPageLoaded();
    driver.executeScript("window.history.go(-1)");
    org.openqa.selenium.browserlaunchers.Sleeper.sleepTight(1000);
  }
} else {}
  System.out.println("No enrollment record found");
}

答案 1 :(得分:0)

我猜contains(@tagName , "a")意味着当前元素具有后代元素a。但实际意味着当前元素的属性名为tagName,此属性的字符串值包含信&#34; a&#34;。

这告诉我,你正试图用一种你真正了解不多的工具做一些中等复杂的事情。不了解XPath并不会感到羞耻,但花几个小时学习基础知识可以避免多少小时的试验和错误,并试图在网络论坛上传达你的问题。

要执行我认为您打算执行的操作,可以使用以下XPath表达式:

.//*[contains(@id, "7RH1V_00Nb0000009Yc1K_body")]//a

如果您尝试自己选择链接,那就是这样。如果您正在尝试选择您正在测试id的元素,正如您的totalbookings XPath表达式所暗示的那样,您可以

.//*[contains(@id, "7RH1V_00Nb0000009Yc1K_body") and .//a]

但是这不会选择链接,这是您声明的目标。

此外,上述两个方法都会查找当前元素的后代(无论是什么)。使用driver.findElements()您似乎没有当前节点,因此从XPath开头删除.并使用//*更有意义...明确表示您正在寻找网页中任何位置的节点,而不仅仅是在某些选定的子树中。