2013-07-23 31 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']");