简体   繁体   中英

Selenium driver - select the desired li item in the list

In a list of 8 Elements I would select the one that contains the search text in children div. I need this because the elements of the list changes order every time. Here I would like to select the one that contains the text "TITLE TO LISTEN". How do I scroll through the list and select the wish li?

Thanks in advance

Here one 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>
            ...

I tried this code, but it don't work because the elements ids change each time.

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

For example:

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

here is number 3, but the order may change. I would first like to get that number and then click on the right link

You could get list of all li elements, and then search for specified text

 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;
     }
 }

Well, then just iterate through for each and ask if the current element has the right text inside it.

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;
    }
}

Note that this is much more easier with CssSelector API .

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

Now just iterate and ask for the right text:)

Use this

driver.findElement(By.xpath("//li[contains(text(), 'Your text goes here')]"))

EDIT: just realised it's very old ques and you might have got ans by now, so for others who are looking for answer to this question.

You can try this :

     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;
         }
     }
   }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM