2013-07-23 32 views
11

當我嘗試使用類名具有頁對象空間class = "country name",我越來越:如何避免頁面對象中的複合類名錯誤?

Compound class names not permitted Selenium::WebDriver::Error::UnknownError) 

我如何使用類名有空間​​。

如:

class = "country name" 
+0

的可能重複使用[化合物類名稱不支持錯誤的webdriver( http://stackoverflow.com/questions/15699900/compound-class-names-are-not-supported-error-in-webdriver) –

+0

@KAK你應該接受一個答案。 – daOnlyBG

回答

15

改爲使用CSS選擇器:

.country.name 

重要的是要注意的是,這個例子是錯誤的!如果"country name"是作爲一個國家的名字,也就是說。類名不能有空格。實際上,class屬性是空格分隔的類列表。這意味着如果你有一個類country name,它不是一個類,它的兩個你的元素屬於不同的類 - 第一個是country,第二個是name

因此,修正你的課程,如果他們錯了。如果不是,請使用CSS選擇器,這是匹配多個類的唯一可靠方法(除了很長且複雜的XPath表達式之外)。不要使用簡單的XPath表達式或CSS選擇器進行天真的屬性比較(//*[@class='country name']*[class='country name']),這顯然是錯誤的。

+0

我們是否必須逃避斜槓和報價?順便說一句,我在Python中。 – User

0

如果您有有空格的類名,你會得到這個錯誤。避免的一種方法是創建一個用於識別元素的xpath。如果你顯示html,我可以創建xpath。同樣嘗試使用類名,因爲多個對象將具有相同的類名。

+0

使用XPath('// * [@ class ='country name']'或者更糟糕的是// * [包含(@class,'country')並且包含(@class,'name')]')錯誤。它把'class' attr當成文本,而我們知道它是一個由空格分隔的令牌列表,我們有巧妙地通過CSS選擇器與它交互的工具。如果元素除了現有的類還有新的類,會發生什麼?如果類動態交換會發生什麼?每當我們可以在邏輯上而不是愚蠢地處理數據時,我們應該。唯一的例外是當我們真的確定我們想要匹配文本而不是邏輯類時 –

+0

無論如何,如果你真的想用XPath表達式來匹配類,CSS選擇器的等價物就是這樣的:'// * [contains(concat ('',normalize-space(@class),''),'country')幷包含(concat('',normalize-space(@class),''),'name')]'。很長很複雜,呃?這將班級列表視爲一個邏輯列表,而不是一個愚蠢的文本。 –

+0

那麼我唯一擔心的是如果有多個對象具有相同的類名稱。如果提供了html,我可以創建一個簡單的xpath,這可能甚至可能不需要我們使用類名稱,邏輯上, – Vinay

0

您將不得不從類名稱中刪除空間,在這種情況下Selenium仍然應該從理論上找到您需要的元素,或者使用CSS選擇器並將其與句點/句號結合以連接類名一起。

即使用CSS選擇器的目標是:

<div class="country code"></div> 

你可以使用:

div.country.code 

,你可以讓你的選擇有點更復雜:

div[class='country code'] 
+1

'div.country.code'是正確的解決方案(即使沒有'div'部分也是如此)。我每天的任何時間都會反對'[class ='country code']''。這將'class'屬性視爲簡單的文本,而我們知道它是一個以空格分隔的令牌列表,我們有工具可以用聰明的方式與它交互。如果元素除了現有的類還有新的類,會發生什麼?如果類動態交換會發生什麼?在這兩種情況下,天真的[[class ='country code']'解決方案在類似'.country.code'或'* [class〜= country] [class〜= code]'的情況下都不能匹配。 –

0

您可以使用這些類名之一,例如

:class => 'country' 

:class => 'name' 

,如果它不能幫助你,那麼你應該切換到使用其他類型的選擇:CSS或:XPath的

但要注意,在以下情況下:CSS你寫:

:css => '.country.name' 

,並在以下情況下:XPath的:

:xpath => '//div[@class='country code'] 

都應該工作

3

你可以用這個

By.cssSelector("*[class^='classname']"); 

^ is for if you entering beginning of the class name, 
$ is for if you entering ending of the class name usage example below with sample class name: tech random corner text_left 

By.cssSelector("*[class^='tech']"); 
By.cssSelector("*[class$='text_left']");