Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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
如何使用Java修复SeleniumWebDriver中的复选框单击?_Java_Selenium_Checkbox - Fatal编程技术网

如何使用Java修复SeleniumWebDriver中的复选框单击?

如何使用Java修复SeleniumWebDriver中的复选框单击?,java,selenium,checkbox,Java,Selenium,Checkbox,我使用Java中的Selenium来测试webapp中复选框的检查。这是我的密码: WebElement checkBox1; checkBox1 = driver.findElement((By.xpath(xpathOfElement))); checkBox1.click(); Selenium Webdriver会找到复选框的位置,但由于某些原因,它不会单击复选框。只有复选框的区域变为灰色,但复选框将不处于活动状态 以下是我的HTML的相关部分: <div id="compone

我使用Java中的Selenium来测试webapp中复选框的检查。这是我的密码:

WebElement checkBox1;
checkBox1 = driver.findElement((By.xpath(xpathOfElement)));
checkBox1.click();
Selenium Webdriver会找到复选框的位置,但由于某些原因,它不会单击复选框。只有复选框的区域变为灰色,但复选框将不处于活动状态

以下是我的HTML的相关部分:

<div id="componentIndicators:1:j_idt2989:sbc" class="ui-chkbox ui-widget" style="position:relative; top:5px;">
  <div class="ui-helper-hidden-accessible">
    <input id="componentIndicators:1:j_idt2989:sbc_input" type="checkbox" onchange="PrimeFaces.ab({s:"componentIndicators:1:j_idt2989:sbc",e:"change",f:"newApplicationForm",p:"componentIndicators:1:j_idt2989:sbc",u:"componentIndicators:1:j_idt2989:wrapper",ps:true});" aria-checked="true" name="componentIndicators:1:j_idt2989:sbc_input">
  </div>
  <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default ui-state-active">
    <span class="ui-chkbox-icon ui-icon ui-c ui-icon-check"></span>
  </div>
</div>

如何用Java解决SeleniumWebDriver中的这个问题?我将非常感谢您的帮助

活动复选框HTML如下所示:

<div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default ui-state-active"> 
  <span class="ui-chkbox-icon ui-icon ui-icon-check ui-c"></span> 
</div> 

非活动复选框HTML如下所示

<div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"> 
  <span class="ui-chkbox-icon ui-icon ui-c ui-icon-blank"></span> 
</div>

尝试操作:

Actions builder = new Actions(driver);
builder.moveToElement(xpathOfElement).click().build().perform();
尝试操作:

Actions builder = new Actions(driver);
builder.moveToElement(xpathOfElement).click().build().perform();

从您提供的源代码中,可以直接搜索输入元素

由于所有相关输入元素都具有相同的id,因此需要在xpath查询结束时使用“[2]”请求“第二个”:

WebElement checkBox = driver.findElement(By.xpath("//div[@class = 'ui-helper-hidden-accessible']/input[contains(@id, 'componentIndicators:1')]"));
checkBox.click();

从您提供的源代码中,可以直接搜索输入元素

由于所有相关输入元素都具有相同的id,因此需要在xpath查询结束时使用“[2]”请求“第二个”:

WebElement checkBox = driver.findElement(By.xpath("//div[@class = 'ui-helper-hidden-accessible']/input[contains(@id, 'componentIndicators:1')]"));
checkBox.click();
  • 我建议您以这种方式使用xpath,就像永远不会给出这样的元素异常一样。重新生成或标识相同的xpath也不会让您感到困惑

  • 如果可能,请始终使用CSSPath

  • 根据您的HTML代码,使用此xpath或csspath

CSS路径:

".ui-chkbox-icon ui-icon ui-c ui-icon-blank"


XPATH:

//span[@class='ui-chkbox-icon ui-icon ui-c ui-icon-blank']

现在可以使用此元素单击

有关xpath的更多信息

用于CSS路径

============================================================

还有一个问题是,所有复选框的属性可能相同

以下是解决方案,请参考我提供的自定义Xpath链接,如下所示:

(//span[contains(@class,'ui-chkbox-icon')])[1]
这里计算为1,2,3。。在您选中复选框之前,所有元素都不会被您接受。现在您拥有了所有不同的元素。

  • 我建议您以这种方式使用xpath,就像永远不会给出这样的元素异常一样。重新生成或标识相同的xpath也不会让您感到困惑

  • 如果可能,请始终使用CSSPath

  • 根据您的HTML代码,使用此xpath或csspath

CSS路径:

".ui-chkbox-icon ui-icon ui-c ui-icon-blank"


XPATH:

//span[@class='ui-chkbox-icon ui-icon ui-c ui-icon-blank']

现在可以使用此元素单击

有关xpath的更多信息

用于CSS路径

============================================================

还有一个问题是,所有复选框的属性可能相同

以下是解决方案,请参考我提供的自定义Xpath链接,如下所示:

(//span[contains(@class,'ui-chkbox-icon')])[1]

这里计算为1,2,3。。在您选中复选框之前,您不会选择所有元素。现在您拥有所有不同的元素。

我认为您无法以任何方式单击您的自定义复选框。您可以尝试使用javascript动态添加活动状态类,看看它是否有效。这是怎么做的-

driver.executeScript("document.getElementById('componentIndicators:1:j_idt2989:sbc').getElementsByTagName('div')[1].className += 'ui-state-active';");
driver.executeScript("document.getElementsById('componentIndicators:1:j_idt2989:sbc')[0].getElementsByTagName('div')[1].className += 'ui-state-active';");
//Replace index 0 with your element's index value. Note, its a zero based index
上面的代码将把类设置为活动的div。现在如果有更多的div具有id-
componentIndicators:1:j_idt2989:sbc
,那么也可以使用数组索引。这是怎么做的-

driver.executeScript("document.getElementById('componentIndicators:1:j_idt2989:sbc').getElementsByTagName('div')[1].className += 'ui-state-active';");
driver.executeScript("document.getElementsById('componentIndicators:1:j_idt2989:sbc')[0].getElementsByTagName('div')[1].className += 'ui-state-active';");
//Replace index 0 with your element's index value. Note, its a zero based index

希望有帮助。

我认为您无法以任何方式单击您的自定义复选框。您可以尝试使用javascript动态添加活动状态类,看看它是否有效。这是怎么做的-

driver.executeScript("document.getElementById('componentIndicators:1:j_idt2989:sbc').getElementsByTagName('div')[1].className += 'ui-state-active';");
driver.executeScript("document.getElementsById('componentIndicators:1:j_idt2989:sbc')[0].getElementsByTagName('div')[1].className += 'ui-state-active';");
//Replace index 0 with your element's index value. Note, its a zero based index
上面的代码将把类设置为活动的div。现在如果有更多的div具有id-
componentIndicators:1:j_idt2989:sbc
,那么也可以使用数组索引。这是怎么做的-

driver.executeScript("document.getElementById('componentIndicators:1:j_idt2989:sbc').getElementsByTagName('div')[1].className += 'ui-state-active';");
driver.executeScript("document.getElementsById('componentIndicators:1:j_idt2989:sbc')[0].getElementsByTagName('div')[1].className += 'ui-state-active';");
//Replace index 0 with your element's index value. Note, its a zero based index

希望有帮助。

我解决了我的问题,谢谢大家的帮助

Thread.sleep(1000);
WebElement element = driver.findElement((By.xpath(xpathOfElement)));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
Thread.sleep(1000);

我解决了我的问题,谢谢大家的帮助

Thread.sleep(1000);
WebElement element = driver.findElement((By.xpath(xpathOfElement)));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
Thread.sleep(1000);

可以为该元素共享xpath吗?当然可以<代码>xpath1=“/html/body/div[1]/div[2]/form/div[3]/div/div/div[2]/div/div/div/div/div[2]/div/div/div/ul/li[2]/div/div/div/fieldset/div/div[1]/div[2]/span”我认为这不是编写xpath的方法。因为当任何元素被开发人员更改时,您肯定不会得到这样的元素异常。您可以手动选中和取消选中复选框并每次发布html吗?我认为复选框的“状态”将在div元素的属性中发生变化,让我们看看active checkbox
Inactive checkbox
您可以为该元素共享xpath吗?当然可以<代码>xpath1=“/html/body/div[1]/div[2]/form/div[3]/div/div/div[2]/div/div/div/div/div[2]/div/div/div/ul/li[2]/div/div/div/fieldset/div/div[1]/div[2]/span”我认为这不是编写xpath的方法。因为当任何元素被开发人员更改时,您肯定不会得到这样的元素异常。您可以手动选中和取消选中复选框并每次发布html吗?我认为复选框的“状态”将在div元素的属性中发生变化,让我们看看active checkbox
Inactive checkbox
我有五个具有相同属性的复选框,Web驱动程序可以找到该元素。我想找到并单击第二个复选框。找不到元素:{“方法”:“xpath”,“选择器”:“//input[contains(@id,'componentIndicators:1')][2]”}@Milky,很抱歉忘记了大括号,请编辑答案再试一次!找不到元素:{“方法”:“xpath”,“选择器”:“(//input[contains(@id,'componentIndicators:1'))[2]”我有五个具有相同属性的复选框,webdriver可以找到该元素。我想找到并单击第二个复选框。找不到元素:{“方法”:“xpath”,“选择器”:”//input[contains(@id,'componentIndicators:1')][2]“}@Milky,对不起,忘记了大括号,请编辑答案,再试一次!找不到元素:{“方法”:“xpath”,“选择器”:”(//input[contains(@id,'componentIndicators:1')])[2]“}我有五个具有相同属性的复选框,webdriver可以基于xpath找到元素。我用一个分支观看了这个过程。
isChecked=driver.findelelement((By.xpath(xpat))