C# WatiN-根据浏览器中的元素(例如Heading1元素)切换到浏览器窗口

C# WatiN-根据浏览器中的元素(例如Heading1元素)切换到浏览器窗口,c#,watin,C#,Watin,是否有人在WatiN中实现了不同的方法来切换浏览器窗口? 目前支持的方法有: browserType 类型:System.::.Type 要附加到的WatiN浏览器类型。 约束 类型:WatiN.Core.Constraints.::.Constraint 要查找的浏览器窗口的约束查找.ByUrl()、查找.ByUri()、查找.ByTitle()和查找.By(“hwnd”,windowHandle) 我想创建一个方法,根据浏览器页面中的某些元素或使用hwnd(应该是唯一的)切换到新的弹出窗口。

是否有人在WatiN中实现了不同的方法来切换浏览器窗口? 目前支持的方法有:

browserType

类型:
System.::.Type

要附加到的WatiN浏览器类型。
约束

类型:
WatiN.Core.Constraints.::.Constraint

要查找的浏览器窗口的
约束
<支持代码>查找.ByUrl()、
查找.ByUri()
查找.ByTitle()
查找.By(“hwnd”,windowHandle)

我想创建一个方法,根据浏览器页面中的某些元素或使用hwnd(应该是唯一的)切换到新的弹出窗口。 理想情况下,这种方法应该同时支持IE和Firefox浏览器

用例:

假设我打开了一个浏览器窗口,单击一个链接和一个按钮后,它会打开两个新的弹出/浏览器窗口。两者标题相同,但内容不同。 一个窗口的标题1文本为“我的标题1”,另一个窗口的标题2文本为“我的标题2”。 现在我想切换到第二个弹出的浏览器窗口,其中标题为heading2元素。
是否可以使用
Browser.AttachTo(Browser.getType(),Find.By…)??

根据您的用例,单击链接后,将打开一个新的弹出/窗口。如果您确定父窗口将有H1元素(用于验证/附加)和子窗口H2元素(验证/附加)。因此,您需要创建H1和H2元素,如下所示

[ElementTag("h1")]
public class HeaderLevel1 : ElementContainer<HeaderLevel1>
{
    /// <summary>
    /// Initializes a new instance of the <see cref="Div"/> class.
    /// Mainly used by WatiN internally.
    /// </summary>
    /// <param name="domContainer">The DOM container.</param>
    /// <param name="htmlH1Element">The HTML h1 element.</param>
    public HeaderLevel1(DomContainer domContainer, INativeElement htmlH1Element) : base(domContainer, htmlH1Element) { }

    /// <summary>
    /// Initializes a new instance of the <see cref="Div"/> class.
    /// Mainly used by WatiN internally.
    /// </summary>
    /// <param name="domContainer">The DOM container.</param>
    /// <param name="finder">The HTML h1 element.</param>
    public HeaderLevel1(DomContainer domContainer, ElementFinder finder) : base(domContainer, finder) { }

    /// <summary>
    /// Gets the name of this Watin element.
    /// </summary>
    /// <returns></returns>
    public string GetName()
    {
        return "HeaderLevel1";
    }
}    
[ElementTag(“h1”)]
公共类标题级别1:元素容器
{
/// 
///初始化类的新实例。
///主要由WatiN内部使用。
/// 
///DOM容器。
///HTMLH1元素。
public HeaderLevel1(DomContainer-DomContainer,initiveElement-htmlH1Element):基本(DomContainer,htmlH1Element){}
/// 
///初始化类的新实例。
///主要由WatiN内部使用。
/// 
///DOM容器。
///HTMLH1元素。
public HeaderLevel1(DomContainer-DomContainer,ElementFinder):base(DomContainer,finder){}
/// 
///获取此Watin元素的名称。
/// 
/// 
公共字符串GetName()
{
返回“HeaderLevel 1”;
}
}    
同样,对于H2,您也可以这样做。对于IE,您可以使用,
IECollection浏览器=IE.InternetExplorers(), 它返回IE集合,对于每个集合,获取H2元素计数,然后尝试使用当前标题附加。我不太确定我们如何在FF中实现这一点,但一定有办法

谢谢,
我想要一个通用的解决方案。我知道使用IECollection这是可能的,但我基本上希望使用lambda表达式,如
browser=browser.AttachToNoWait(MyBrowser.getType(),Find.ByMyBrowser(browsr=>browsr.H1(“标题一”).Exists))Find
以获得MyBrowser或
Browser
和lambda
Find.ByBrowser元素(elem=>elem.Text==“Heading One”)
Find.ByBrowser(browser=>browser.H1(Find.ByText(“Heading One”)。存在)
。你可以把它作为我问题的答案吗?因为IE和Firefox的实现是不同的,所以使用你的代码(Lambda表达式)是不可能的。但可以使用如下所示的不同方法<代码>
public void AttachToOtherBrowser(Constraint newFindBy){switch(ConfigurationManager.AppSettings[“Browser”]){case“IE”:Util.\u Browser=IE.AttachTo(Util.\u Browser.GetType(),newFindBy);break;case“FF”:Util.\u Browser=FireFox.AttachTo(Util.\u Browser.GetType(),newFindBy);break;}}