Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 使用cssSelector-SeleniumWebDriver按文本选择嵌套元素_Java_Selenium_Selenium Webdriver - Fatal编程技术网

Java 使用cssSelector-SeleniumWebDriver按文本选择嵌套元素

Java 使用cssSelector-SeleniumWebDriver按文本选择嵌套元素,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我正在尝试根据文本选择一个元素。我遇到的问题是元素文本在源代码中多次存在。我使用xpath来查找它(尽管我试图避免使用xpath),但这就是我所能做的 以下是我正在使用的html: <ul id="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage" class="cbl centered d2" style="width:511px;"> <li> <inp

我正在尝试根据文本选择一个元素。我遇到的问题是元素文本在源代码中多次存在。我使用xpath来查找它(尽管我试图避免使用xpath),但这就是我所能做的

以下是我正在使用的html:

<ul id="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage" class="cbl centered d2" style="width:511px;">
    <li>
        <input id="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_0" name="ctl00$ctl00$Dialogs$Dialogs$ctlAcknowledgeMessage_ConditionalDecline$cblMessage$0" onclick="CannedCommentSelected(this);" value="Complexity of job requires extra charge" type="checkbox">
        <label for="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_0">Complexity of job requires extra charge</label>
    </li>
    <li>
        <input id="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_1" name="ctl00$ctl00$Dialogs$Dialogs$ctlAcknowledgeMessage_ConditionalDecline$cblMessage$1" onclick="CannedCommentSelected(this);" value="Complexity of job requires extra time" type="checkbox">
        <label for="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_1">Complexity of job requires extra time</label>
    </li>
    <li>
        <input id="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_2" name="ctl00$ctl00$Dialogs$Dialogs$ctlAcknowledgeMessage_ConditionalDecline$cblMessage$2" onclick="CannedCommentSelected(this);" value="Current workload requires extra time" type="checkbox">
        <label for="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_2">Current workload requires extra time</label>
    </li>
    <li>
        <input id="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_3" name="ctl00$ctl00$Dialogs$Dialogs$ctlAcknowledgeMessage_ConditionalDecline$cblMessage$3" onclick="CannedCommentSelected(this);" value="Distance to property requires extra charge" type="checkbox">
        <label for="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_3">Distance to property requires extra charge</label>
    </li>
</ul>
  • 工作的复杂性需要额外收费
  • 工作的复杂性需要额外的时间
  • 当前的工作量需要额外的时间
  • 距离酒店需要额外收费
我使用的是
driver.findElement(By.xpath(//label[contains(text(),'Complexity of job requires extra charge'))))但我开始得到“元素当前不可见,因此可能无法与之交互”错误,这导致我发现有多个标签带有“工作复杂性需要额外费用”文本

我尝试了
driver.findElement(通过.cssSelector(“#Dialogs\u Dialogs\u ctacknowledgemessage\u ConditionalDecline\u cblMessage>#Dialogs\u Dialogs\u ConditionalDecline\u cblMessage\u 0>标签[文本='作业复杂性需要额外收费]”)但它在尝试查找元素时超时

我做错了什么


我甚至尝试了
driver.findelelement(通过.cssSelector(“#Dialogs_Dialogs_ctacknowledgemessage_ConditionalDecline_cblMessage>input[value='作业的复杂性需要额外收费'])
我确信它会工作,但它也会超时寻找它。

在这种情况下,您应该尝试使用
JavascriptExecutor
与它交互,如下所示:-

WebElement el = driver.findElement(By.cssSelector("input[value='Complexity of job requires extra charge']"));

((JavascriptExecutor) driver).executeScript("arguments[0].click();",el);
已编辑:-

List<WebElement> els = driver.findElements(By.cssSelector("input[value='Complexity of job requires extra charge']"));
for(WebElement el : els) 
{
  if(el.isDisplayed() && el.isEnabled())
  {
   el.click();
  }
}
List els=driver.findElements(由.cssSelector(“输入[value=”作业复杂性需要额外收费“]));
对于(WebElement el:els)
{
如果(el.isDisplayed()&&el.isEnabled())
{
el.click();
}
}

希望对您有所帮助……:)

您的CSS不起作用,因为它试图将标签作为输入的子项来查找,而输入实际上是兄弟项。您也可以告诉xpath通过ID查找父ul。以下XPath应该可以工作:

//ul[@id="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage"]/li/label[contains(text(), 'Complexity of job requires extra charge')]
如果您确实对选择输入感兴趣,以便选中该框,请尝试以下操作:

//ul[@id="Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage"]/li/label[contains(text(), 'Complexity of job requires extra charge')]/preceding-sibling::input

css选择器有两个问题:

用于直接子元素,但是id以
cblMessage
结尾的元素和
cblMessage_0
之间有另一个元素,id以
cblMessage_0
结尾的元素和您要查找的元素是同级元素

您可以使用此
css选择器
定位包含文本的元素

driver.findElement(By.cssSelector("#Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_0 ~ label"));

~
表示兄弟姐妹。

使用Css选择器
输入[value='Complexity of job requires extra charge']
当我这样做时,我得到“元素当前不可见,因此可能无法与之交互”,因为有多个元素具有该值。这就是为什么我试图从ul id开始变得更具体的原因,当您使用
by.xpath
时,我似乎无法正确地将cssSelector降到该值text,为什么不使用
for
属性进行定位?它在您的示例HTML中是独一无二的。一个原因是如果我可以让文本选项工作,代码将更具可读性。另一个原因是,在编码时要更加灵活和精确,而不必查看特定页面的源代码。如果可能的话,我希望能够完全避免xpath,但您是对的。在这种情况下,如果我不能让其他任何东西工作,它可能会工作将其存储在列表中。迭代并检查
元素。isDisplayed
并单击显示的元素。使用此选项时,我始终会收到以下错误:给定的选择器//ul[@id=“Dialogs\u Dialogs\u ctlAcknowledgeMessage\u ConditionalDecline\u cblMessage”]/li/label[包含(text(),“作业的复杂性需要额外费用]]无效或不会导致WebElementhmmm…该路径与FireBug中的FirePath配合使用,并具有上面的html副本。元素是否偶尔隐藏?埋在一个iframe里?您需要等待元素出现吗?这会很好地通过代码,但实际上不会单击元素。我的猜测是,它在源代码中找到了一个不可见的元素,这破坏了我最初的xpath语句。@DustinN你是说有更多不可见的元素使用相同的xpath???很遗憾,我无法共享url。是的,存在多个具有相同输入值的隐藏元素。这就是为什么我试图将其附加到ul id并深入到value@DustinN一旦执行
driver.findelelements(由.cssSelector(“输入[value=”作业的复杂性需要额外收费“]))。size()
并让我知道结果…@DustinN确定,然后在循环中替换
el。单击()
((JavascriptExecutor)驱动程序)。executeScript(“参数[0]。单击();”,el)。应该可以了。谢谢你指出了“兄弟姐妹”部分。直到现在,我还不知道如何选择兄弟姐妹。这确实有效,我将在具有更好的描述性类名或id的情况下使用它。