Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查元素在Selenium Java中是否可单击_Java_Selenium_Selenium Webdriver_Automation - Fatal编程技术网

检查元素在Selenium Java中是否可单击

检查元素在Selenium Java中是否可单击,java,selenium,selenium-webdriver,automation,Java,Selenium,Selenium Webdriver,Automation,我是Selenium新手,需要检查元素是否可以在SeleniumJava中单击,因为元素。click()会传递链接和标签 我尝试使用以下代码,但不起作用: WebDriverWait wait = new WebDriverWait(Scenario1Test.driver, 10); if(wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/

我是
Selenium
新手,需要检查元素是否可以在
Selenium
Java
中单击,因为
元素。click()
会传递
链接和
标签

我尝试使用以下代码,但不起作用:

WebDriverWait wait = new WebDriverWait(Scenario1Test.driver, 10);

if(wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")))==null)
等待。直到(ExpectedConditions)
不返回null,它将满足条件或抛出
TimeoutException

您可以检查元素是否已显示和启用

WebElement element = driver.findElement(By.xpath);
if (element.isDisplayed() && element.isEnabled()) {
    element.click();
}
用于检查元素是否可见并已启用,以便您可以单击它

ExpectedConditions.elementtobelickable
如果预期条件为true,则返回,否则将抛出,它永远不会返回
null

因此,如果您使用
ExpectedConditions.ElementToBickable
查找一个元素,该元素将始终为您提供可单击的元素,因此无需检查
null
条件,您应尝试以下操作:-

WebDriverWait wait = new WebDriverWait(Scenario1Test.driver, 10); 
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")));
element.click();
正如您所说的
element.click()
链接和
标签上传递,这并不意味着元素不可单击,它意味着返回的元素
已单击
,但单击操作可能不会对元素执行任何事件

注意:-我建议您始终首先尝试通过
id
name
className
和其他定位器查找元素。如果您遇到查找困难,请使用
cssSelector
,并始终将最后一个优先级放在
xpath
定位器上,因为它比其他定位器查找元素的速度慢


希望它能帮助您:)

从源代码中,您可以看到,
ExpectedConditions.ElementToBelickable()
,它将判断元素是否可见和启用,因此您可以将
isEnabled()
isDisplayed()
一起使用。下面是源代码

公共静态ExpectedCondition元素可选择(最终WebElement){
返回新的ExpectedCondition(){
公共WebElement应用(WebDriver){
WebElement visibleElement=(WebElement)ExpectedConditions.visibilityOf(element).apply(驱动程序);
试一试{
return visibleElement!=null&&visibleElement.isEnabled()?visibleElement:null;
}捕获(StaleElementReferenceException arg3){
返回null;
}
}
公共字符串toString(){
返回“可点击元素:”+元素;
}
};

}
element.isDisplayed()&&element.isEnabled()
将返回
true
,但元素仍将不可单击,因为它被其他元素隐藏/重叠

在这种情况下,捕获到的异常是:

org.openqa.selenium.WebDriverException:未知错误:元素不存在 可点击点(781704)。其他元素将收到单击:

请改用此代码:

WebElement  element=driver.findElement(By.xpath"");  
JavascriptExecutor ex=(JavascriptExecutor)driver;
ex.executeScript("arguments[0].click()", element);
它将起作用。

List wb=driver.findElements(By.xpath(newXpath));
List<WebElement> wb=driver.findElements(By.xpath(newXpath));
        for(WebElement we: wb){
            if(we.isDisplayed() && we.isEnabled())
            {
                we.click();
                break;
            }
        }
    }
for(WebElement we:wb){ if(we.isDisplayed()&&we.isEnabled()) { we.click(); 打破 } } }
有些事情你必须小心:

  • inconjunction with as在定位并可单击后返回,即可见启用
  • 在此过程中,将忽略默认情况下在
    直到
    条件下遇到的
    NotFoundException
    实例
  • 一旦所需元素的等待时间到期且无法定位和单击,将引发超时异常
  • 解决这一问题的不同方法是:
    • 要在返回元素后立即调用
      click()
      ,可以使用:

      new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]"))).click();
      
    • 要简单地验证元素是否位于并可单击,请将WebDriverWait包装在
      try catch{}
      块中,如下所示:

      try {
             new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")));
             System.out.println("Element is clickable");
           }
      catch(TimeoutException e) {
             System.out.println("Element isn't clickable");
          }
      
      WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]"))); 
      ((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
      
    • 如果WebDriverWait返回已定位且可单击的元素,但该元素仍然不可单击,则需要调用
      executeScript()
      方法,如下所示:

      try {
             new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")));
             System.out.println("Element is clickable");
           }
      catch(TimeoutException e) {
             System.out.println("Element isn't clickable");
          }
      
      WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]"))); 
      ((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
      

当元素不可单击时,class属性包含禁用的

WebElement-WebElement=driver.findElement(By.id(“elementId”));
如果(!webElement.getAttribute(“类”)包含(“禁用”)){
webElement.click();
}

有一个名为“cursor”的CSS属性,用于确定鼠标指针位于元素上方时要显示的鼠标光标类型


它是用来使元素可点击的,因此它可以用来检查元素是否可点击。

那么我应该使用侦听器吗?检查屏幕上的任何事件label@SandeepKrishnappa不需要,您应该尝试使用javascript在label的浏览器控制台上执行click first,并验证它是否接收到任何click事件……如果接收到,那么它肯定会通过selenium进行单击。@SaurabhGaur-我有一个类似的问题。我想知道你是否能帮我回答这个问题?非常感谢。有些情况下,
element.isDisplayed()&&element.isEnabled()
将返回
true
,但元素仍然不可单击,因为元素被其他元素隐藏/重叠。在这种情况下,捕获的异常是:
org.openqa.selenium.WebDriverException:未知错误:元素在点(781704)处不可单击。其他元素将收到点击:…
这完全正确,大多数人都不知道这一事实@拉贾戈帕兰:没错,您的元素应该在UI中可见,并且不应该有任何覆盖。@cruisepandey visible和enable不足以知道元素是否可单击,这就是为什么ElementToBelickable在我们讨论的上一个问题中失败的原因,在这里,这个用户在他的答案中解释了相同的内容。@cruisepandey更清楚地阅读了他的答案,他解释了
element.isDisplayed()&&element.isEn