2013-11-27 34 views
2

作爲我測試的一部分,系統應該查明用於打開網站的設備是移動設備還是普通桌面。找出類名是否包含某些文本

我不斷收到錯誤:

從螢火

"InvalidSelectorError: Unable to locate an element with the xpath expression //*[contains(@class, is-mobile..."

物業:

<body class="login-page is-desktop"> 

我的測試:

public class isMobile { 

public static boolean isMobile = false; 

public static boolean checkIfMobile(WebDriver driver) throws Exception { 

    List<WebElement> list = driver.findElements(By 
      .xpath("//body[contains(@class, 'is-mobile'")); 
    if (list == null) { 
     return false; 
    } else { 
     return true; 
    } 
} 
} 

有人可以告訴我正確的XPath應該如何?

+0

或者,首先獲取body元素(使用任何你想要的方法 - 例如'// body'),然後通過'element.getAttribute(「class」)''檢查它的類屬性。 – Arran

回答

9

你似乎缺少閉合圓形和方形括號:

更改此:

//body[contains(@class, 'is-mobile' 

進入這個:

//body[contains(@class, 'is-mobile')] 

作爲一個側面說明,考慮到這代碼有另一個稍微隱藏的問題,這就是你將匹配你不想匹配的東西,比如這個類屬性:login-page not-is-mobile

沒有辦法像使用CSS3選擇器[class~="is-mobile"]那樣簡單地匹配。但是,你能來解決這個做這個:

//body[contains(concat(' ', @class, ' '), ' is-mobile ')] 

所有這些空間是有,以確保你的空間之間,它也符合哪怕是在類的開頭或結尾匹配只能東西屬性。

確實很難看,但這是XPath的方式。

0

這是一個很好的使用錯誤工具的例子。 HTML設計者錯誤的一件事是使用一個單一的class字符串屬性來編碼多個值。不幸的是,那些至少有一個數組構造可用的XPath設計師未能糾正這個錯誤。所以不要使用XPath,儘管如Mosty Mostacho所說,你可以使它成爲owork。

CSS設計師做得更好。雖然他們沒有做類似數組的事情,但他們至少將class提升爲一個簡單的字符串。使用By.cssSelector('body.is-mobile') - 這是CSS定位器的正確使用。

相關問題