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