2014-09-01 118 views
0

我在這裏有以下問題: 我想要使用Watin的Find.ByText從網頁中獲取元素。但是,我沒有在C#中使用正則表達式。C#Watin Find.ByText與正則表達式

該聲明將返回所需的元素。

return this.Document.Element(Find.ByText("781|262")); 

當我嘗試使用正則表達式時,我得到整個頁面。

return this.Document.Element(Find.ByText(new Regex(@"781\|262"))); 

我試圖讓這個元素:

<td>781|262</td> 

我也試過

return this.Document.Element(Find.ByText(Predicate)); 

private bool Predicate(string s) 
{ 
    return s.Equals("781|262"); 
} 

以上的作品,雖然這並不:

private bool Predicate(string s) 
{ 
    return new Regex(@"781\|262").IsMatch(s); 
} 

我現在意識到,在謂詞s是整個頁面內容。我想這個問題是與Document.Element。 任何幫助表示感謝,謝謝。

+0

在C#中結束,@符號意味着你的字符串是逐字字符串。 IE中,您不需要在字符串內部掃描特殊字符,如文件名「C:\\ folder \\ mifile」。txt「vs @」C:\ folder \ mifile.txt「 – Oscar 2014-09-01 15:01:21

+0

謝謝!我只是試過\\ |而不是@,仍然沒有運氣 – Zackline 2014-09-01 15:02:57

+0

也許..如果你使用逐字字符串文字而忘記你沒有需要花費特殊字符,這些花斑字符將被視爲正則表達式的一部分,什麼不明顯是你想要的...... – Oscar 2014-09-01 15:06:38

回答

0

嗯,我沒有意識到正則表達式也會匹配body/html元素,因爲模式顯然也包含在它們中。我必須指定該文本必須開始,並通過使用模式結束^和$,所以它僅匹配所需的元素:

^781\u007c262$ 

\ u007c匹配|,我用這個,因爲MSDN文檔也做了。

最終代碼:

<td>781|262</td> 

return Document.TableCell(Find.ByText(new Regex(@"^\d{3}\|\d{3}$"))); 

Document.TableCell僅在TD元素嘗試正則表達式用來加快搜索。

@用於防止C#將\解釋爲轉義序列。

^用於僅匹配元件與下面的模式 \ d {3}匹配didit文本開頭0-9 3次

\ |匹配|從字面上

\ d {3}匹配數字0-9的3倍

$的元素也必須與這種模式

+0

那麼它的工作呢?如果是,您可以將其標記爲答案。這對像我們這樣的人會有所幫助。 – rahoolm 2014-09-03 11:36:06

+1

是的,它的確如此。謝謝你通知我。我已經嘗試過了,但你必須等待3個小時才能接受你自己的答案。 – Zackline 2014-09-03 11:53:31

0

嘗試用:

return this.Document.Element(Find.ByText(new Regex("781\\|262"))); 

return this.Document.Element(Find.ByText(new Regex("781|262"))); 

選擇符合自己需求的,我不知道如果字符 「\」 是你顯著。

爲了實例化正則表達式類,不需要字符串是逐字字符串。

+0

謝謝,但是給無法識別的轉義序列帶來了編譯器錯誤。 – Zackline 2014-09-01 15:11:16

+0

@Zackline我已經更新了我的回答 – Oscar 2014-09-01 15:17:25

+0

謝謝,但仍然不起作用。我認爲|需要逃脫,所以我看不出第二個應該如何工作。那麼,我也會認爲第一個會起作用,但是與@相同,事實並非如此。 – Zackline 2014-09-01 15:27:17