【问题标题】:Handling dynamic webtable using selenium java [closed]使用 selenium java 处理动态 webtable [关闭]
【发布时间】:2021-11-12 08:18:30
【问题描述】:

我正在尝试单击特定公司并从此网站http://demo.guru99.com/test/web-table-element.php#在控制台中打印公司名称@我没有遇到此类元素异常 这是我的代码:

driver.findElement(By.xpath("//a[contains(text(),'Marico Ltd.')]/parent::td")).click();

【问题讨论】:

  • 你的代码有什么问题?
  • 它没有显示此类元素异常,xpath 可能有问题,我无法找到该元素的确切 xpath
  • 该页面上没有“Marico Ltd”文字...
  • 动态变化
  • 但是你试图通过特定的文本来捕捉元素......那么你想要做什么?

标签: java selenium selenium-webdriver testing automation


【解决方案1】:

您可以使用循环来搜索元素,方法是刷新页面直到显示。

注意:如果元素没有显示,它将进入无限循环,因此请在某个时候将其中断。

方法#1:循环检查 10 次所需元素是否正在显示。

driver.get("http://demo.guru99.com/test/web-table-element.php#");
        int i = 0;
        while (i < 10) {
            if (isElementDisplayed()) {
                driver.findElement(By.xpath("//a[contains(text(),'Marico Ltd.')]/parent::td")).click();
                System.out.println("Navigated to Guru99 Bank at " + i + " iteration.");
                break;
            } else {
                driver.navigate().refresh();
                i++;
            }
        }

方法#2:检查并返回boolean 值,如果元素存在则返回true,否则返回false

public static boolean isElementDisplayed() {
    try {
        driver.findElement(By.xpath("//a[contains(text(),'Marico Ltd.')]/parent::td"));
        return true;
    } catch (org.openqa.selenium.NoSuchElementException e) {
        return false;
    }
}

输出:

Navigated to Guru99 Bank at 4 iteration.

【讨论】:

  • 不要在isElementDisplayed()... 中硬编码定位器,而是采用By 并允许传入定位器。整个方法确实不是一个好主意。而是使用WebDriverWait,它基本上会为您完成此操作,而无需编写所有这些代码。
  • 我阅读了整个问题和所有 cmets。这些都没有改变我的反应。
【解决方案2】:

您应该获取元素列表并检查其大小(如果存在):

List<WebElement> list = driver.findElements(By.xpath("//a[contains(text(),'Marico Ltd.')]"));
Assert.assertTrue("Text not found!", list.size() > 0);

您也不应该在findElement 中使用/parent::td。接下来可以点击断言后的元素

List.get(0).click()

【讨论】:

  • 我的 xpath 是否正确,谁能帮帮我
  • 我测试了代码...没问题...我更改了您在答案中编写的 xpath。你不应该在findElement 中使用/parent::td,我在我的代码中删除了它
  • 你从来没有解释过为什么不应该使用/parent::td
【解决方案3】:

您的定位器不一定是错误的,但在这种情况下它不起作用,但我们可以修复它。问题是当 Selenium 尝试单击一个元素时,它会找到元素的 x-y 尺寸,然后单击确切的中心。在这种情况下,TD 的精确中心会错过 A 标签(超链接)。

解决此问题的最简单方法是使用定位器单击 A 标签,

//a[contains(text(),'Marico Ltd.')]

最好的做法是使用WebDriverWait 确保元素在对其执行操作之前准备就绪。

new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(text(),'Marico Ltd.')]"))).click();

【讨论】:

  • 问题是,有时页面上可能没有包含“MartinCo ...”的链接,而且是随机的。所以你的解决方案在超时后会引发错误,我认为
  • @HanaBzh 正确。我已要求 OP 定义当所需公司不在页面上但尚未收到回复时要做什么。