【问题标题】:How to avoid Compound Class name error in Page Object?如何避免页面对象中的复合类名称错误?
【发布时间】:2013-07-22 10:11:05
【问题描述】:

当我尝试使用在页面对象中有空格 class = "country name" 的类名时,我得到:

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

如何使用有空格的类名。

例如:

class = "country name"

【问题讨论】:

标签: selenium selenium-webdriver pageobjects page-object-gem


【解决方案1】:

你可以用这个

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']");

【讨论】:

    【解决方案2】:

    您可以使用这些类名之一,例如

    :class => 'country' 
    

    :class => 'name'
    

    如果它不能帮助你,那么你应该切换到使用其他类型的选择器 :css 或 :xpath

    但请注意,如果是 :css 你写的:

    :css => '.country.name'
    

    如果是 :xpath:

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

    两者都应该工作

    【讨论】:

      【解决方案3】:

      改用 CSS 选择器:

      .country.name
      

      需要注意的重要一点是,这个例子是错误的!如果"country name" 是一个国家的名称,那就是。类名中不能有空格。事实上,class 属性是一个以空格分隔的类列表。这意味着如果你有一个类country name,它不是一个类,而是你的元素所属的两个不同的类——第一个是country,第二个是name

      因此,如果课程有误,请修正课程。如果不是,请使用 CSS 选择器,这是匹配多个类的唯一可靠方法(除了非常长且复杂的 XPath 表达式)。不要在简单的属性比较(//*[@class='country name']*[class='country name'])中使用琐碎的 XPath 表达式或 CSS 选择器,这是完全错误的。

      【讨论】:

      • 我们必须避开斜线和引号吗?顺便说一句,我在 Python 中。
      【解决方案4】:

      您必须从类名中删除空格,在这种情况下,Selenium 仍应理论上找到您需要的元素,或者使用 CSS 选择器并将其与句点/完整停止将类名连接在一起。

      即,使用 CSS 选择器来定位:

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

      你可以使用:

      div.country.code
      

      你可以让你的选择器更精细一点:

      div[class='country code']
      

      【讨论】:

      • div.country.code 是正确的解决方案(甚至可以没有 div 部分)。我每天任何时候都会投票反对[class='country code']。这将class 属性视为一个简单的文本,而我们知道它是一个以空格分隔的标记列表,并且我们拥有以一种巧妙的方式与之交互的工具。如果元素除了现有的类之外还有一个新的类,会发生什么?如果类被动态交换会发生什么?在这两种情况下,幼稚的[class='country code'] 解决方案都无法匹配,而.country.code*[class~=country][class~=code] 之类的解决方案将起作用。
      【解决方案5】:

      如果你的类名中有空格,你会得到这个错误。一种避免的方法是创建一个用于标识元素的 xpath。如果您显示 html,我可以创建 xpath。也可以尝试使用类名,因为多个对象将具有相同的类名。

      【讨论】:

      • 使用 XPath(//*[@class='country name'] 或更糟的//*[contains(@class, 'country') and contains(@class, 'name')])是非常错误的。它将class attr 视为文本,而我们知道它是一个以空格分隔的标记列表,并且我们有工具可以巧妙地与之交互(通过 CSS 选择器)。如果元素除了现有的类之外还有一个新的类,会发生什么?如果类被动态交换会发生什么?每当我们可以逻辑地而不是愚蠢地处理数据时,我们就应该这样做。唯一的例外是当我们确定要匹配文本而不是逻辑类时
      • 不管怎样,如果你真的想用XPath表达式来匹配类,相当于CSS选择器是这样的://*[contains(concat(' ',normalize-space(@class),' '),' country ') and contains(concat(' ',normalize-space(@class),' '),' name ')]。很长很复杂,嗯?这将类列表视为一个逻辑列表,而不是一个哑文本。
      • 好吧,我唯一关心的是是否有多个对象具有相同的类名。如果提供了 html,我可以创建一个简单的 xpath,它可能甚至不需要我们使用类名,逻辑上
      猜你喜欢
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2013-05-17
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      相关资源
      最近更新 更多