首页 > 解决方案 > 我有正确的 XPath,但 selenium 没有在 Highcharts 弹出窗口中单击

问题描述

我的应用程序是 Angular JS,我们正在使用 Highcharts。我正在尝试单击弹出窗口上的关闭按钮,并且我有正确的 xpath,包括相对和绝对路径,可以找到正确的元素。

当我手动检查它时,但是当我使用 Java 从 Selenium 运行并且它没有单击它时。它也不会抛出任何错误。我也尝试过使用 Javascript,但它没有点击,但是当我从控制台手动执行 JavaScript 时,它再次起作用。

硒版本:3.141.59

按钮:

在此处输入图像描述

安慰:

在此处输入图像描述

HTML 片段:

<button type="button" style="float:right" class="btn btnclose " data-dismiss="modal" aria-hidden="true">
 <i class="fa fa-2x fa-times-circle">
</i></button>

代码:

document.getElementsByClassName('btn btnclose ')[1].click()

public static void clickByJS(WebDriver driver){     
    JavascriptExecutor js = (JavascriptExecutor)driver;
    driver.switchTo().activeElement();
    js.executeScript("document.getElementsByClassName('btn btnclose ')[1].click()"); 
}

在此处输入图像描述

注意:我也检查了弹出窗口的其他元素,当我在浏览器中手动尝试时,我可以验证 xpath 是否正常工作并找到该元素,但使用 Selenium 时不会单击。这不是页面加载问题,因为我尝试过多次显式等待并且运气不佳。由于某种原因,该元素不可见/难以处理。

标签: javaseleniumselenium-webdriverhighchartsautomated-tests

解决方案


getElementsByClassName()

getElementsByClassName()方法返回文档中具有指定类名的所有元素的集合。

所以你不能使用getElementsByClassName(). 您可以尝试通过单个课程,例如btnclose. 因此,您的有效代码块将是:

public static void clickByJS(WebDriver driver){     
    JavascriptExecutor js = (JavascriptExecutor)driver;
    driver.switchTo().activeElement();
    js.executeScript("document.getElementsByClassName('btnclose')[1].click()"); 
}

更新

由于getElementsByClassName()仍然不起作用,我建议您尝试使用久经考验的WebDriverWait,如下所示:

  • 使用cssSelector

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.btn.btnclose[data-dismiss='modal'] > i.fa.fa-2x.fa-times-circle"))).click();
    
  • 使用xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='btn btnclose' and @data-dismiss='modal']/i[@class='fa fa-2x fa-times-circle']"))).click();
    

此外,您可以使用JavascriptExecutorWebDriverWait以及如下:

  • 使用cssSelector

    ((JavascriptExecutor)driver).executeScript("arguments[0].click();", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.btn.btnclose[data-dismiss='modal'] > i.fa.fa-2x.fa-times-circle"))));        
    
  • 使用xpath

    ((JavascriptExecutor)driver).executeScript("arguments[0].click();", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='btn btnclose' and @data-dismiss='modal']/i[@class='fa fa-2x fa-times-circle']"))));
    

推荐阅读