web-dev-qa-db-ja.com

Selenium WebDriverで「ul」クラスのすべての「li」要素を取得する方法

私はSelenium Webdriverを初めて使用します。セクション内のすべてのリンクをクリックするテストを実行する必要があるという要件に遭遇しました。 Javaのコードで誰かが私を助けてくれますか?その特定のセクションのfirebugプロパティを示す画像を添付しました。以下のコードを試しましたが、nullリストを返します。

public static void main(String[] args) {

    WebDriver driver = new FirefoxDriver();

    driver.get("https://dev.www.tycois.com/");
    driver.manage().window().maximize();

    List<WebElement> allElements = driver.findElements(By.xpath("html/body/div[10]/div/div[1]/div[3]/ul[1]/li[5]"));
    System.out.println(allElements);

    for (WebElement element: allElements) {
        System.out.println(element.getText());
        element.click();          
    }
}

前もって感謝します。

6
Tarun

詳細は不明ですが、フッターのINDUSTRIESセクションのリンクを印刷しようとしているようです。それが本当なら、これはうまくいくはずです。

_driver.get("https://dev.www.tycois.com/");
WebElement industries = driver.findElement(By.cssSelector("div.columns.three.alpha > ul"));
List<WebElement> links = industries.findElements(By.tagName("li"));
for (int i = 1; i < links.size(); i++)
{
    System.out.println(links.get(i).getText());
}
_

このループでリンクをクリックすることはできません。最初のリンクをクリックすると、ページに移動しなくなるためです。各リンクのURLを配列に格納してから、それぞれのdriver.get(url)を格納することをお勧めします。または、予想されるURLを配列に格納し、リンクからのURLを予想されるURLと比較して、ナビゲートする必要がないようにすることもできます。選択はあなた次第です...

7
JeffC

JeffCのソリューションは、以下で説明するTweakで動作します-

driver.get("https://dev.www.tycois.com/");
WebElement industries = 
driver.findElement(By.cssSelector("div.columns.three.alpha > ul"));
List<WebElement> links = industries.findElements(By.tagName("li"));
for (int i = 0; i < links.size(); i++)
{
    System.out.println(links.get(i).getText());
}

上記の代替回答。サイトを初めて使用したため、コメントできませんでした。

for(int i=1; i < links.size(); i++)

しかし、これはリストの最初の要素を見逃しています。使用する修正案-

for(int i=1; i <= links.size(); i++)

indexOutOfBoundsExceptionが発生します。

修正するには、イテレータを1ではなく0から開始するように設定するだけです

3
david_c

以下のコードで試すことができます。

アプリケーションに応じてxpathを変更するだけです。

List<WebElement> liElements = driver.findElements(By.xpath(".//*[@id='fk-mainhead-id']/div[2]/div/div/ul/li"));
        System.out.println(liElements);

        for(int i=1; i <= liElements.size(); i++)
        {
            WebElement linkElement = driver.findElement(By.xpath(".//*[@id='fk-mainhead-id']/div[2]/div/div/ul/li[" + i + "]/a"));
            System.out.println(linkElement.getText());      

        }
0
Sravan547

たとえば、次のように使用できます。

driver.findElements(By.xpath("//li[contains(@class,'managed-services')]/ul/li/a"));

通常、htmlのルートにアタッチされたXPath、つまり絶対xpathを使用することはお勧めしません。常に可能な限り短いセレクター、つまり相対xpathを使用するようにしてください。

また、リンクが非表示の場合は、アクションをトリガーする必要があります。これにより、リンクを有効にすることができます(たとえば、メニューを開くなど)。

0