0

在 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

4 回答 4

3

用这个

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

编辑:刚刚意识到这是非常古老的问题,你现在可能已经有了答案,所以对于其他正在寻找这个问题的答案的人来说。

于 2014-05-15T16:27:12.243 回答
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;
     }
 }
于 2013-11-02T12:23:53.743 回答
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]");

现在只需迭代并要求正确的文本:)

于 2013-11-03T17:59:13.600 回答
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;
         }
     }
   }

}
于 2014-06-19T07:36:12.463 回答