2016-12-28 19 views
2

我的下一個標籤結構:C#硒網絡驅動程序和CSS:起點

<body> 
    <parent> 
     <nested/> 
    </parent> 
</body> 

我做以下的事情:

IWebDriver _driver; 

var parent = _driver.FindElement(By.Css("parent")); 
var nested = parent.FindElement(By.Css("parent nested")); 

通知,我需要找到嵌套元素只能這樣:起初我找到父母標記,然後我用父母作爲起點找到嵌套的一個。 但是,當我使用邏輯錯誤的定位器(「父親嵌套」,因爲一起「父母親嵌套」是錯誤的定位器),parent.FindElement 返回(!)我正確的IWebElement,就像如果我從DOM模型的頂部搜索。

有趣的是,當我做

var nested = parent.FindElement(By.Css("parent")); 

它拋出未發現異常的元素。

我想我明白了一些錯誤或者只是不知道什麼。它是如何工作的?我怎樣才能避免「父母嵌套」的問題?

回答

2

cssSelector將從右到左進行評估。

這意味着第一個孩子將被評估,然後檢查他們的父母是否存在。

在你的情況,

var nested = parent.FindElement(By.Css("parent nested")); 

第一,檢查nested元素是否存在於DOM(這裏,嵌套元素)一個孩子。如果存在,則檢查parent是否是其父項。

var nested = parent.FindElement(By.Css("parent")); 

這裏,parent將被檢查是否是給定的元素(調用父)的孩子。但事實並非如此。所以,給NoSuchElementException

參考:

  1. Why do browsers match CSS selectors from right to left?
+0

謝謝你和@NarendraRajput –

3

我覺得這裏使用的是錯誤的方式這就是爲什麼你得到錯誤

var nested = parent.FindElement(By.Css("parent")); 

在這裏,你正在做的 -

「首先找到父標籤,然後我用父母爲起點找到 親本標籤本身「

這是錯誤的。可以有不同的方式來得到這個 -

  1. 化妝父標籤作爲起點,找到子標籤 -

var child= driver.FindElement(By.Css("parent")).FindElement(By.Css("nested"));

  • 直接找到子標籤 -
  • var child= driver.FindElement(By.Css("parent nested"));

    +0

    你是對的,但如果你VAR孩子= driver.FindElement(By.Css( 「母公司」))FindElement(通過.Css(「父嵌套」)); (看看第二個定位器),無論如何你會得到一個正確的元素。我只是想明白爲什麼。 –

    +1

    因爲'By.Css(「par ent nested」)'找到父子標籤爲「嵌套的」父標籤,所以無論你是否可以找到該子子碼都是By.Css(「父嵌套」)'或者可以通過將父項作爲起始點移動,然後移動到子項,如'var child = driver.FindElement(By.Css(「parent」))。FindElement(By.Css(「par ent nested」));'indirect它也發現了子子元素。 – NarendraR

    +0

    'Css(「parent nested」)'是xpath(「//父//嵌套」)的替代方法''你也要用這種方式定位嵌套元素 – NarendraR