2

我試圖用一個軟件名稱硒(網絡鼠)來模擬用戶與瀏覽器硒IDE 1.9.1的XPath與包含選擇

交互。例如,我試圖把用戶名字段名「約翰

然而, '用戶名文本框' 的 'ID' 是username_947232,username_8237

的格式username_ [隨機數]

我的語法如下:

//*[contains(@id="username_(/\d+/)")] 

但它不工作,任何人有任何想法?

謝謝你的任何建議!

回答

3

使用

//*[starts-with(@id, 'username_') 
    and 
    floor(substring-after(@id, 'username_')) = substring-after(@id, 'username_') 
    ] 

說明

該表達選擇其id屬性的字符串值與字符串開頭的任何元件和此字符串的其餘部分(在開始"username_"之後)是一個整數。

這裏我們使用的事實,下面的表達式爲真,當且僅當$string代表整數:

floor($string) = $string 

XSLT - 基於驗證

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
     "//*[starts-with(@id, 'username_') 
    and 
    floor(substring-after(@id, 'username_')) = substring-after(@id, 'username_') 
    ] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

當這一轉變應用於此XML文檔

<t> 
<user id="username_Xyz"/> 
<user id="username_Xyz123"/> 
<user id="username_123Xyz"/> 
<user id="username_123Xyz456"/> 
<user id="username_2015"/> 
</t> 

XPath表達式求值,並從該評價所選擇的節點被複制到輸出:

<user id="username_2015"/> 

待辦事項:另外兩個這個問題的答案將選擇從所有5個user元件上述文件 - 當然這是不正確的。

+0

+1,有趣的方式。雖然我猜這取決於他所需的複雜程度。 – Arran

+0

@阿蘭,不客氣。此答案中的XPath表達式可以在任何複雜程度的XML文檔上正常工作。當'$ string'是一個整數的字符串表示形式時,'floor($ string)= $ string'的表達式就是'true()「。 –

-1

你應該能夠只使用

//*[contains(@id, 'username_')] 

雖然這可能不是最優的,如果你有比在年底的數字以外的任何可能性。

0

使用starts-with

//*[starts-with(@id, "username_")]