Selenium驱动程序 - 在列表中选择所需的li项目

时间:2013-11-02 11:09:03

标签: java selenium

在8个元素的列表中,我将选择包含子div中搜索文本的元素。我需要这个,因为列表的元素每次都会改变顺序。在这里,我想选择包含“TITLE TO LISTEN”文本的那个。如何滚动列表并选择愿望li?

提前致谢

这里有一个李:

...
                    <li id="3636863298979137009" class="clearfix" data-size="1" data-fixed="1" data-side="r">
                        <div class="userContentWrapper">
                            <div class="jki">
                                <span class="userContent">
                                    TITLE TO LISTEN
                            </div>                                              
                            <div class="TimelineUFI uiContainer">
                                <form id="u_0_b0" class="able_item collapsed_s autoexpand_mode" onsubmit="return window.Event && E" action="/ajax/ufi/modify.php" method="post" >                                       
                                    <input type="hidden" value="1" name="data_only_response" autocomplete="off">
                                    <div class="TimelineFeedbackHeader">
                                        <a class="ction_link" role="button" title="Journal" data-ft="{"tn":"J","type":25}" rel="dialog" href="/ajax/" tabindex="0" rip-style-bordercolor-backup="" style="" rip-style-borderstyle-backup="" >LISTEN</a>
                                    </div>
                                </form>
                            </div>

                        </div>
                    </li>
                </ol>
            </div>
            ...

我尝试了这段代码,但它不起作用,因为元素ID每次都会改变。

    driver.findElement(By.xpath("//li[8]/div[2]/div/div[2]/form/div/div/span[2]/a")).click();

例如:

If text contain "TEXT TO LISTEN":   li[3]/div[2]/div/div/div[2]/div/div/span
Link "listen" i want to click :     li[3]/div[2]/div/div[2]/form/div/div/span[2]/a

这里是3号,但顺序可能会改变。我首先要获得该号码,然后点击右侧链接

4 个答案:

答案 0 :(得分:2)

您可以获取所有li元素的列表,然后搜索指定的文本

 for(int i=0; i< listOfLiElements.Count, i++){
 if(listOfLiElements[i].FindElement(By.ClassName("userContent")).Text == "TITLE TO LISTEN")
     {
      correctElement = listOfLiElements[i].FindElement(By.TagName("a"));
      i =listOfLiElements.Count;
     }
 }

答案 1 :(得分:2)

那么,只需遍历每一个并询问当前元素是否包含正确的文本。

List<Element> listOfLiTags = driver.findElement(By.Id("yourUlId")).findElements(By.TagName("li"));
for(Element li : listOfLiTags) {
    String text = li.getElement(By.ClassName("userContent").getText();
    if(text.equals("TITLE TO LISTEN") {
        //do whatever you want and don't forget break
        break;
    }
}

请注意,使用CssSelector API可以更轻松。

List<Element> listOfSpans = driver.findElements(
   By.CssSelector("ul[id=yourId] li span[class=userContent]");

现在只需迭代并索取正确的文字:)

答案 2 :(得分:2)

使用此

driver.findElement(By.xpath("//li[contains(text(), 'Your text goes here')]"))
编辑:刚刚意识到这是一个非常古老的问题,你现在可能已经有了问题,所以对于那些正在寻找这个问题答案的人来说。

答案 3 :(得分:1)

你可以试试这个:

     public void ClickLink()
{
   WebElement ol =driver.findElement(By.id("ol"));
   List<WebElement> lis=ol.findElements(By.tagName("li"));
   ArrayList<String> listFromGUI=new ArrayList<>();

   for(int i=0;i<lis.size();i++)
   {
     WebElement li=ol.findElement(By.xpath("//ol[@id='ol']/li["+(i+1)+"]/div[2]/div/div/div[2]/div/div/span"));
     if(li.getText().trim().equals("TEXT TO LISTEN"))
     {
         WebElement link=ol.findElement(By.xpath("//ol[@id='ol']/li["+(i+1)+"]/div[2]/div/div[2]/form/div/div/span[2]/a"));
         if(link.getText().trim().equals("LISTEN"))
         {
             link.click();
             break;
         }
     }
   }

}