簡體   English   中英

單擊列表中找到的所有元素<WebElement>

[英]Clicking all elements found in List<WebElement>

我正在嘗試單擊動態表行中錨標記內的 i 標記中的 class 屬性找到的元素的所有實例。 具體來說,它是包含多個單元格的一行,在最后一個單元格中有一系列 4 個鏈接,帶有 X 或 O。如果正方形是 X,則可以單擊它,並在短暫等待后變為 O。鏈接寫成如下:

<a class="foobar"><i class="dontNeedToClick"><i></a>
<a class="foobar"><i class="dontNeedToClick"><i></a>
<a class="foobar"><i class="needToClick"><i></a>
<a class="foobar"><i class="dontNeedToClick"><i></a>

當needToClick 元素被單擊時,該類將更改為dontNeedToClick 元素。在包含數千個O 的數據庫中,只有不到一百個X 可供滾動,因此自動單擊它們會節省大量時間。 我可以成功計算元素出現在表中的實例,但是當我使用 .findElements() 將元素放入 List 對象並嘗試遍歷它時,我得到 ElementNotVisibleException。

到目前為止,這是我的示例代碼:

// get the count of thumbs down accounts
    int elementsCount= driver.findElements(By.className("needToClick")).size();
    System.out.println("Amount of elements: " + elementsCount);

// loop and click through all elements found

    for (int x = 0; x < elementCount; x++) {
        List<WebElement> elements = driver.findElements(By.className("needToClick"));
        WebElement client = elements.get(x);
        client.click();
        Thread.sleep(5000);
    }

我試過使用 Iterator 並得到同樣的異常。

        Iterator<WebElement> clickElement = elements.iterator();
        while (clickElement.hasNext()) {
            clickElement.next().click();
        }

我也嘗試過使用 foreach 循環。

    List<WebElement> thumbsDown = driver.findElements(By.className(expectedClass));

    for(WebElement element : thumbsDown) {
        element.click();
    }

我會使用 xpath,但我對動態表的經驗不是很豐富,並且無法找到一種方法來獲取包含我正在尋找的元素的行以及與它相關的其他元素,並且想出了一種不太優雅的方法,例如因為只需通過類名查找所有元素就足夠了。 將不勝感激任何幫助。

確保您嘗試單擊的元素可見。 如果您不關心可見性,請使用 javascipt 單擊:

JavascriptExecutor js = (JavascriptExecutor) driver;
WebDriverWait wait = new WebDriverWait(driver, 5);

List<WebElement> elements = driver.findElements(By.className("needToClick"));
elements.forEach(e -> {
    js.executeScript("arguments[0].click();", e);
    wait.until(ExpectedConditions.attributeToBe(e,"class", "dontNeedToClick"));
    //if element have not only dontNeedToClick class use attributeContains
    //wait.until(ExpectedConditions.attributeContains(e,"class", "dontNeedToClick"));
});

檢查您是否可以單擊一個元素並更改類:

driver.findElement(By.className("needToClick")).click();

如果不嘗試 xpath:

driver.findElement(By.xpath("//a[i[@class='needToClick']]"));
//or
driver.findElement(By.xpath("//a[i[contains(@class,'needToClick')]]"));

是否在遍歷列表或嘗試生成列表時拋出異常?

如果是前者,您需要做的是在每次點擊后重新生成列表 - 即使您加載了一個完全相同的新頁面,硒也會將新頁面上的元素視為“不同”而您不會能夠使用您在舊頁面上找到的任何元素。 (編輯:我再次查看了你的循環,看起來你做的這部分是對的。我猜你需要等待頁面完全加載)

如果是后者,那么您可能需要等待頁面加載,並確保您嘗試查找的元素都存在。 在 selenium 中,您可以設置顯式或隱式超時,但我個人更喜歡time.sleep(however many seconds)因為 selenium 可能會“說”它在完全加載所有 javascript 之前已加載。

希望這可以幫助!

我認為您必須使用 xpath,因為我在<i>標簽中看到了您的元素

像這樣

//a[@class='foobar']//i[contains(@class,'Click')]

代碼

 List<WebElement> elements = driver.findElements(By.xpath("//a[@class='foobar']//i[contains(@class,'Click')]"));
 for (WebElement tempEle : elements) {
  tempEle.click();
}

您還可以在 For each 循環中使用if with break來查找特定元素

如果要選擇列表列表的每個元素,只需使用 foreach 循環:

for(WebElement e : List<WebElement>){
   e.doThings();
}
   int elementsCount= driver.findElements(By.className("needToClick")).size();
System.out.println("Amount of elements: " + elementsCount);

    List<WebElement> elements = driver.findElements(By.className("needToClick"));

for (int x = 0; x < elementCount; x++) {
    WebElement client = elements.get(x);
    Thread.sleep(5000);

客戶端點擊(); }

列表元素 = driver.findElements(By.className("needToClick")); element.get(0).click(); 它將適用於網絡列表元素上的點擊事件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM