查找并单击具有相同定位器的所有网络元素
Find and click on all the webelements with same locator
我试图在随机的 Facebook 页面中找到所有 继续阅读 并在新选项卡中打开它们。
首先找到一个包含继续阅读的post,打开新标签页,在新标签页打开的页面进行一些操作后,将关闭,然后找到第二个 继续阅读 post,如果有的话,在新选项卡中打开,执行一些操作并关闭,继续处理直到没有更多 继续阅读 posts.
下面的代码是我为了实现上面的目的而写的。
List <WebElement> continuereading = driver.findElements(By.xpath("//span[@class='text_exposed_link']//a[@target='_blank' and contains (text(), 'Continue Reading')]"));
System.out.println(continuereading);
for (int i=0; i <= continuereading.size(); i++){
//check if there is continue reading element in post
if (continuereading.size() > 0) {
WebElement contreading = driver.findElement(By.xpath("//span[@class='text_exposed_link']//a[@target='_blank' and contains (text(), 'Continue Reading')]"));
//open link in new tab
Actions action = new Actions(driver);
action.keyDown(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform();
//scroll to the element
jse.executeScript("arguments[0].scrollIntoView(true);", contreading);
contreading.click();
action.keyUp(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform();
//close new tab
action.keyDown(Keys.CONTROL).sendKeys(String.valueOf('\u0077')).perform();
action.keyUp(Keys.CONTROL).sendKeys(String.valueOf('\u0077')).perform();
}
}
问题由于Continue Reading元素点击后不会消失,连续点击第一个元素在新标签页打开直到循环结束,而其他 继续阅读 元素根本不会被点击。
有没有办法解决这个问题,使所有 继续阅读 元素都能被找到并点击?
那是因为在您的 for
循环中您再次获取该元素。
WebElement contreading = driver.findElement(By.xpath("//span[@class='text_exposed_link']//a[@target='_blank' and contains (text(), 'Continue Reading')]"));
此特定行将始终为您提供页面上的第一个元素并单击它(正是您所遇到的)。
相反,只需执行:
for (int i=0; i < continuereading.size(); i++){
//open link in new tab
Actions action = new Actions(driver);
action.keyDown(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform();
//scroll to the element
jse.executeScript("arguments[0].scrollIntoView(true);", continuereading.get(i));
continuereading.get(i).click();
action.keyUp(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform();
//close new tab
action.keyDown(Keys.CONTROL).sendKeys(String.valueOf('\u0077')).perform();
action.keyUp(Keys.CONTROL).sendKeys(String.valueOf('\u0077')).perform();
}
请注意,我还修复了您的 for
循环迭代。您从 0
迭代到 list.size()
包括在内,最终会抛出 IndexOutOfBoundsException
.
我试图在随机的 Facebook 页面中找到所有 继续阅读 并在新选项卡中打开它们。
首先找到一个包含继续阅读的post,打开新标签页,在新标签页打开的页面进行一些操作后,将关闭,然后找到第二个 继续阅读 post,如果有的话,在新选项卡中打开,执行一些操作并关闭,继续处理直到没有更多 继续阅读 posts.
下面的代码是我为了实现上面的目的而写的。
List <WebElement> continuereading = driver.findElements(By.xpath("//span[@class='text_exposed_link']//a[@target='_blank' and contains (text(), 'Continue Reading')]"));
System.out.println(continuereading);
for (int i=0; i <= continuereading.size(); i++){
//check if there is continue reading element in post
if (continuereading.size() > 0) {
WebElement contreading = driver.findElement(By.xpath("//span[@class='text_exposed_link']//a[@target='_blank' and contains (text(), 'Continue Reading')]"));
//open link in new tab
Actions action = new Actions(driver);
action.keyDown(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform();
//scroll to the element
jse.executeScript("arguments[0].scrollIntoView(true);", contreading);
contreading.click();
action.keyUp(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform();
//close new tab
action.keyDown(Keys.CONTROL).sendKeys(String.valueOf('\u0077')).perform();
action.keyUp(Keys.CONTROL).sendKeys(String.valueOf('\u0077')).perform();
}
}
问题由于Continue Reading元素点击后不会消失,连续点击第一个元素在新标签页打开直到循环结束,而其他 继续阅读 元素根本不会被点击。
有没有办法解决这个问题,使所有 继续阅读 元素都能被找到并点击?
那是因为在您的 for
循环中您再次获取该元素。
WebElement contreading = driver.findElement(By.xpath("//span[@class='text_exposed_link']//a[@target='_blank' and contains (text(), 'Continue Reading')]"));
此特定行将始终为您提供页面上的第一个元素并单击它(正是您所遇到的)。 相反,只需执行:
for (int i=0; i < continuereading.size(); i++){
//open link in new tab
Actions action = new Actions(driver);
action.keyDown(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform();
//scroll to the element
jse.executeScript("arguments[0].scrollIntoView(true);", continuereading.get(i));
continuereading.get(i).click();
action.keyUp(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform();
//close new tab
action.keyDown(Keys.CONTROL).sendKeys(String.valueOf('\u0077')).perform();
action.keyUp(Keys.CONTROL).sendKeys(String.valueOf('\u0077')).perform();
}
请注意,我还修复了您的 for
循环迭代。您从 0
迭代到 list.size()
包括在内,最终会抛出 IndexOutOfBoundsException
.