2016-07-15 81 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。 –

相關問題