2016-07-15 100 views
1

我想根据文本选择一个元素。我遇到的问题是元素文本在源代码中存在多次。我使用xpath来找到它(尽管我试图避免xpath),但这就是我能够工作的一切。使用cssSelector选择嵌套元素使用cssSelector - Selenium WebDriver

下面是我对工作的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(By.cssSelector("#Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage > #Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage_0 > label[text='Complexity of job requires extra charge']"));,但它试图找到元素超时。

我在做什么错?

我甚至试过driver.findElement(By.cssSelector("#Dialogs_Dialogs_ctlAcknowledgeMessage_ConditionalDecline_cblMessage > input[value='Complexity of job requires extra charge']"));,我肯定会工作,但它超时寻找。

+1

使用Css选择器'输入[值='作业的复杂性需要额外费用'] – Madhan

+0

当我这样做时,我得到“元素当前不可见,因此可能无法互动”,因为有多个元素那个价值。这就是为什么我试图从ul id开始更具体,我似乎无法正确地将cssSelector放到该值文本上 –

+0

当您使用'By.xpath'时,为什么不使用'for'属性定位?它在您的示例HTML中是唯一的。 –

回答

1

在这种情况下,你应该尝试使用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(); 
    } 
} 

希望它能帮助... :)

+0

这会越过代码就好了,但实际上并没有点击元素。我的猜测是,它会发现源代码中存在的不可见元素,这些元素正在破坏我的初始xpath语句。 –

+0

@DustinN你的意思是有更多的不可见元素与相同的xPath? –

+0

你能分享你的网站URL吗? –

0

你的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 
+0

使用此命令时我总是收到以下错误:\t 给定选择器// ul [@ id =“Dialogs_Dialogs_ctlAcknowledgeMes​​sage_ConditionalDecline_cblMessage”]/li/label [contains(text(),'作业的复杂性需要额外费用')]无效或不会导致WebElement –

+0

嗯......该路径可以与FireBug中的FirePath一起正常工作,并带有上面的html副本。是偶尔隐藏的元素?埋在一个iframe中?你是否需要等待元素出现? –

1

你有两个问题cssSelector

>用于直接孩子,但ID与cblMessagecblMessage_0结束元素具有与ID与cblMessage_0和结束元素之间的另一个元素,你正在寻找的元素是兄弟姐妹。

您可以使用此cssSelector与文本

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

~代表兄弟来定位的元素。

+0

谢谢指出“兄弟姐妹”的一块。直到现在我还没有意识到如何选择兄弟姐妹。这是行得通的,我会用它来描述更好的类名或id。 –