2016-02-29 107 views
0

我有問題獲取鏈接的文本。獲取鏈接文本Selenium java

現場我有文字鏈接 <a href="DetailsZZ-10048.html">ZZ-10048</a>,與ZZ-的一部分是靜態的,數量增加,它不是我以前所知的。我需要得到這個號碼。

我用看:Get link text - Selenium, Java但我有所有鏈接,網址(而不是鏈接的文本)

我也試過:How to gettext() of an element in Selenium Webdriver但我得到的輸出Printing null每次我改變了,尋找一個解決方案

而且該解決方案:Java Selenium, how to get linkText (anchor) from link WebElement不好也是,因爲它不承認"a[href*='ZZ-']"

所以,最近的一個是:

List<WebElement> elements = driver.findElements(By.tagName("a")); 
for (int i = 0; i < elements.size(); i++) { 
    System.out.println(elements.get(i).getAttribute("href")); 
} 

但我該如何更改以查看不僅URL,而是鏈接的名稱? (尤其是從ZZ-開始)

+0

你可以嘗試找到一個鏈接'根據文本。xpath':'// a [contains(href,「DetailsZZ - 」)]' – Andersson

回答

3

嗨,你可以使用下面的代碼提取數字:

public String splitfunc(String str) 
{ 
    str = str.replace(".html", ""); 
    String[] array = str.split("-"); 
    return array[1]; 
} 


    List<WebElement> elements = driver.findElements(By.tagName("a")); 
    for (int i = 0; i < elements.size(); i++) { 
    System.out.println(splitfunc(elements.get(i).getAttribute("href"))); 
} 
+0

很好的黑客.. upvoted .. :) – Subh

+0

工作差不多,我想我知道你想要顯示:)我只是''java.lang.ArrayIndexOutOfBoundsException:1「 '回報錯誤,所以我只需要找出發生了什麼(但感謝棒:)) – Michal

+1

@Michal:我猜測有一些'a'元素沒有**的數值**他們的'href'屬性;例如:「DetailsZZ」或「DetailsZZ-」或「<其他一些隨機文本>」,這就是爲什麼它會拋出** ArrayOutOfBoundsException **,因爲數組中沒有第二個值需要顯示。嘗試使用上述代碼,正如** @ Andersson **所評論的那樣,通過替換這些列表中的任何一個'List elements = driver.findElements(By.xpath(「// a [contains(@href,」DetailsZZ-「)] 「));' **或** 'List elements = driver.findElements(By.xpath(」// a [starts-with(href,「DetailsZZ - 」)]「));' – Subh

1

要找到可

List<WebElement> elements = driver.findElements(By.partialLinkText("ZZ")); 
// or 
List<WebElement> elements = driver.findElements(By.cssSelector("[href*='ZZ']")); 

爲了獲得元素的href和文字,你可以做

for (WebElement element : elements) { 
    String href = element.getAttribute("href"); 
    String text = element.getText(); 
    // or 
    String text = element.getAttribute("innerText"); 

    // and to get the number 
    String[] data = text.split("-"); 
    String number = data[1]; 
} 
+0

它的工作原理非常好,我只是在String [] data = text.split(「 - 」);行上得到了NullPointerException,所以我正在找出發生了什麼:) – Michal

+0

@Michal與兩個版本的文本解壓縮? – Guy

+0

yup,但@Subh建議的解決方案很好 – Michal

0

既然您正在查找鏈接的文本, d不是實際的href網址本身,我認爲它更清晰並且不太容易出錯,以便抓取元素文本並將其用於解析而不是拉出href屬性。然後,如果文本是總是的形式ZZ-someNumber然後你可以使解析相當簡單。使用Java 8

實施例(假定駕駛員已經創建並加載正確的頁面):

String leadingStr = "ZZ-"; 
List<Integer> numbers = driver.findElements(By.tagName("a")) 
           .stream() 
           .map(WebElement::getText) 
           .filter(str -> null != str && str.startsWith(leadingStr)) 
           .map(str -> str.replace(leadingStr,"").trim()) 
           .filter(str -> !str.isEmpty()) 
           .map(Integer::valueOf) 
           .collect(Collectors.toList()); 

實施例,而不流:

String leadingStr = "ZZ-"; 
List<Integer> numbers = new ArrayList<>(); 
for (WebElement elem : driver.findElements(By.tagName("a"))) { 
    String text = elem.getText(); 
    if (text.startsWith(leadingStr)) { 
     numbers.add(Integer.valueOf(text.replace(leadingStr,"").trim())); 
    } 
} 

當然上述兩種需要如果假設它們總是以ZZ-someNumber的形式出現的錯誤處理是無效的,但它只是簡單地在整數轉換周圍添加一些try catch塊,則可以進行更多的錯誤處理。

0

一個更優雅的方式來獲得它沒有索引越界異常的風險是如果您的語言水平允許使用foreach。

這將允許您獲取鏈接的文本,而不是你的請求,而不是做這麼多的解析。

修剪只是額外的防禦性編碼。

List<WebElement> links = driver.findElements(By.tagName("a")); 
for (WebElement link : links) { 
    System.out.println(link.getText().replace("ZZ-","").trim()); 
} 
0
WebElement element = driver.findElement(By.partialLinkText("ZZ-10048")); 
String txt = element.getText(); 
String[] words = txt.split("-"); 
System.out.println(words[1]); 
+3

您能否提供此代碼的解釋? – gkubed

+0

我不確定,但element.element.getText()不應該編譯,因爲元素不是WebElement中的公共字段。 – Markus

+0

對不起,這是我的錯誤。我現在糾正了... –