我有正确的XPath,但硒在Highcharts弹出窗口中没有点击。

问题描述 投票:0回答:1

我的应用程序是Angular JS,我们正在使用Highcharts。我试图点击弹出窗口上的关闭按钮,我有正确的xpath,无论是相对的还是绝对的,都能找到正确的元素。

当我手动检查它时,但当我用Java从Selenium运行时,它没有点击它。它也没有抛出任何错误。我也试过用Javascript,它也没有点击,但是当我从控制台手动执行JavaScript时,它又工作了。

Selenium版本:3.141.59。

Button.Button.Selenium版本:3.141.59

enter image description here

Console:

enter image description here

HTML Snippet :

<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()"); 
}

enter image description here

注:我也检查了弹出窗口的其他元素,我可以验证xpath是否有效,当我在浏览器中手动尝试时,我可以找到该元素,但在Selenium中没有点击。这不是页面加载的问题,因为我已经尝试过多次明确的等待,但运气不佳。由于某些原因,该元素不可见intractable。

javascript selenium highcharts
1个回答
0
投票

确保你的定位器是唯一的。它可以确保使用chrome控制台也如下面所示。

enter image description here

这可能是同步问题。例如,当你的模型即将在页面上弹出时,Selenium会同时进行点击,所以在这种情况下,点击会被执行而不会出现任何错误。在这种情况下,你可以引入显式等待来确保元素已经准备好执行动作。

WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("button.btn.btnclose")));
element.click();

或者为了调试的目的,你可以使用一些硬编码的等待。Thread.sleep 脚本中,以确保是否是时间问题。请注意,不建议使用硬编码等待。请参考下面的代码。

Thread.sleep(5000);
driver.findElement(By.cssSelector("button.btn.btnclose")).click();

另一种Javascript方法来执行点击。

WebElement element = driver.findElement(By.cssSelector("button.btn.btnclose"));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].click();",element); 

另一种执行点击的方法是 Actions 阶层

WebElement element = driver.findElement(By.cssSelector("button.btn.btnclose"));
Actions action = new Actions(driver);
action.moveToElement(element).click().perform();

0
投票

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']"))));
    
© www.soinside.com 2019 - 2024. All rights reserved.