14

Web ページに 9 行 6 列のテーブルがあります。「MakeGoodDisabled-Programwise_09_44_38_461(n)」というテキストを検索して、セルの xpath を取得したいと考えています。以下を使用しましたが、ページ上のテキストが見つからないため失敗します。助けていただけますか?これをコーディングするために Selenium Webdriver Junit を使用しています。

List < WebElement > links = driver.findElements(By.tagName("td"));

Iterator < WebElement > itr = links.iterator();
while (itr.hasNext()) {
 String test = itr.next().getText();

 if (test.equals("MakeGoodDisabled-Programwise_09_44_38_461(n)")) {
  String xpath = driver.findElement(By.name(test)).getAttribute("xpath");
  System.out.println(xpath);
 }
}
4

13 に答える 13

34

これを使用して、xpath をクロールして生成することもできます。

以下のメソッドを呼び出す

generateXPATH(element, "");

出力は次のようになります。

/html[1]/body[1]/div[5]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/form[1]/div[2]/div[1]/input[2]

方法

private String generateXPATH(WebElement childElement, String current) {
    String childTag = childElement.getTagName();
    if(childTag.equals("html")) {
        return "/html[1]"+current;
    }
    WebElement parentElement = childElement.findElement(By.xpath("..")); 
    List<WebElement> childrenElements = parentElement.findElements(By.xpath("*"));
    int count = 0;
    for(int i=0;i<childrenElements.size(); i++) {
        WebElement childrenElement = childrenElements.get(i);
        String childrenElementTag = childrenElement.getTagName();
        if(childTag.equals(childrenElementTag)) {
            count++;
        }
        if(childElement.equals(childrenElement)) {
            return generateXPATH(parentElement, "/" + childTag + "[" + count + "]"+current);
        }
    }
    return null;
}
于 2014-12-22T23:06:09.830 に答える
7

要素の XPath は決定的な値ではありません。要素は、多くの XPath で見つけることができます。

Webdriver を使用して XPath を抽出することはできません。たとえできたとしても、自動化ツールによってのみ定義できる最も効率的または賢明なものである可能性は低いです。

于 2013-08-29T12:19:06.287 に答える
1

JavaScript を使用して xpath を生成できます。

function getPathTo(element) {

    // only generate xpaths for elements which contain a particular text:
    if (element.innerText == "MakeGoodDisabled-Programwise_09_44_38_461(n)") {

        // use id to produce relative paths rather than absolute, whenever possible
        if ((element.id !== '') && (element.id != 'undefined')) {
            return 'id(\"' + element.id + '\")';
        }

        // stop looping when you get to the body tag
        if (element === document.body) {
            return element.tagName;
        }

        // calculate position among siblings
        var ix = 0; 
        var siblings = element.parentNode.childNodes;
        for (var i = 0; i < siblings.length; i++) {
            var sibling = siblings[i];
            if (sibling === element) {
                return getPathTo(element.parentNode) + '/' + element.tagName + '[' + (ix + 1) + ']';
            }
            if (sibling.nodeType === 1 && sibling.tagName === element.tagName) {
                ix++;
            }
        }
    }
}

// put all matching xpaths in an array
var allXPaths = []; 

// if you know the particular tag you are looking for, replace * below to optimize 
var allTags = document.getElementsByTagName('*');
for (i = 0; i < allTags.length; i++) {
    if ((getPathTo(allTags[i]).indexOf('/HEAD') == -1) && (getPathTo(allTags[i]).indexOf('undefined') == -1)) {
        allXPaths.push(getPathTo(allTags[i]));
        console.log(getPathTo(allTags[i]));
    }
}
return allXPaths;

その JavaScript を Java で呼び出された文字列に入れるとgetXPaths、次のように実行できます。

ArrayList<String> xpaths = (ArrayList<String>) js.executeScript(getXPaths);

これは文字列ではなく配列を返します。これは、タグ名/innerText が一致する要素がページ内でたまたま少なかったり多かったりした場合に、知りたいと思うからです。配列のサイズでわかります。

于 2013-08-29T16:16:47.783 に答える
0

私とほぼ同じ状況:

テーブルに要素がありますが、それがどの列にあるかわかりません (すべてのユーザー名にまたがるユーザー名のように)。ユーザー名で特定の文字列を見つけて、このユーザーだけの「アクティブ化」ボタンをクリックする必要があります。(ユーザー名のテキストは 2 列目の td[2] にあり、ボタンは 5 列目の td[5] にあります)。したがって、すべての列を 1 つずつ実行してユーザーを見つけ、そのボタンをクリックする必要があります。

for (int iter = 1;; iter++) {
                try {
                    if (iter == 1) {
                            if ((username).equals(driver.findElement(By.xpath("/html/body/div[3]/div[4]/div/form/table/tbody/tr/td[2]/a")).getText())) {
                                driver.findElement(By.xpath("/html/body/div[3]/div[4]/div/form/table/tbody/tr/td[5]/a")).click();
                                break;
                            }
                    }
                } catch (Error e) {}
                try {
                    if (iter > 1) {
                            if ((username).equals(driver.findElement(By.xpath("/html/body/div[3]/div[4]/div/form/table/tbody/tr[" + iter + "]/td[2]/a")).getText())) {
                                driver.findElement(By.xpath("/html/body/div[3]/div[4]/div/form/table/tbody/tr[" + iter + "]/td[5]/a")).click();
                                break;
                            }
                        }
                    } catch (Error e) {}
                } 
          }
于 2013-10-03T15:54:54.493 に答える
0

要素に「xpath」という名前の属性があると仮定すると、次のことができます。

WebElement yourElement = driver.findElement(By.xpath("//td[contains(text(),'MakeGoodDisabled-Programwise_09_44_38_461(n)')]");
String xpathAttributeValue = targetButton.getAttribute("xpath");

それの音によって、あなたはここで何か他のことを達成しようとしていますが、まだ私たちと共有していません. Selenium で xpath を作成しますか? できません。

于 2013-08-29T12:22:30.380 に答える
0

検索された要素のxpathを取得するために利用できる特別な関数ではないと思います。このためには、まず要素を手動で見つけてから、getXpath 関数を使用して xpath を取得する必要があります。

于 2016-07-18T07:42:11.643 に答える
0

反復する前に、このクラスを使用します。次に、XPATHIDFromWebElement を見つけると、

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class XPATHDriverWrapper {
Map xpathIDToWebElementMap = new LinkedHashMap();
Map webElementToXPATHIDMap = new LinkedHashMap();
public XPATHDriverWrapper(WebDriver driver){
    WebElement htmlElement = driver.findElement(By.xpath("/html"));
    iterateThroughChildren(htmlElement, "/html");
}

private void iterateThroughChildren(WebElement parentElement, String parentXPATH) {
    Map siblingCountMap = new LinkedHashMap();

    List childrenElements = parentElement.findElements(By.xpath(parentXPATH+"/*"));
    for(int i=0;i<childrenElements.size(); i++) {
        WebElement childElement = childrenElements.get(i);
        String childTag = childElement.getTagName();
        String childXPATH = constructXPATH(parentXPATH, siblingCountMap, childTag);
        xpathIDToWebElementMap.put(childXPATH, childElement);
        webElementToXPATHIDMap.put(childElement, childXPATH);
        iterateThroughChildren(childElement, childXPATH);
//          System.out.println("childXPATH:"+childXPATH);
    }
}

public WebElement findWebElementFromXPATHID(String xpathID) {
    return xpathIDToWebElementMap.get(xpathID);
}

public String findXPATHIDFromWebElement(WebElement webElement) {
    return webElementToXPATHIDMap.get(webElement);
}

private String constructXPATH(String parentXPATH,
        Map siblingCountMap, String childTag) {
    Integer count = siblingCountMap.get(childTag);
    if(count == null) {
        count = 1;
    } else {
        count = count + 1;
    }
    siblingCountMap.put(childTag, count);
    String childXPATH = parentXPATH + "/" + childTag + "[" + count + "]";
    return childXPATH;
}
}

Document から ID を生成する別のラッパー クラスは、http ://scottizu.wordpress.com/2014/05/12/generating-unique-ids-for-webelements-via-xpath/ に投稿されています。

于 2014-05-12T23:21:10.227 に答える