我有一个自动脚本,它使用Selenium和页面对象模型以及C#绑定,并且需要运行两个窗口。该网站也在Angular 2中完成。需要发生的是每个窗口需要被带到某个点,然后在两个窗口中快速连续点击一个按钮。使用Selenium网格从两个单独的实例生成单独的窗口。窗口出现就好了,第一个开关(当它产生时切换到第二个窗口)无缝地发生
以下是生成每个窗口的代码
窗口1:
//start up the browser and initialize any test variables
driver1 = InitializeTestObjects(testID, true, true);
winHandle1 = driver1.CurrentWindowHandle;
窗口2:
//second browser
driver2 = InitializeTestObjects(testID, false, true);
winHandle2 = driver2.CurrentWindowHandle;
其中winHandle1和winHandle2是每个窗口的当前句柄,并在生成后立即抓取
随着脚本逐步完成。它将从页面对象类加载页面对象。以下是加载页面对象的脚本代码:
mt2 = new MissionTab(driver2);
mt2.clickAutomate();
那个页面对象类
public class MissionTab : HomePage
{
public MissionTab(IWebDriver driver)
: base(driver)
{
PageFactory.InitElements(driver, this);
}
#region Page Objects
//private NgWebElement btnOpen = angDriver.FindElement(By.XPath("//*[@id='sts-mission-view-card-footer']/div/div/button[1]"));
private IWebElement btnAutomate = driver.FindElement(By.XPath("//*[@id='sts-mission-view-card-footer']/div/div/button[2]"));
private IWebElement chkAutoRefresh = driver.FindElement(By.XPath("//*[@id='sts-mission-view-card-header']/sts-card-header/div/div[2]/div/div/div[1]/div[2]/md-checkbox"));
private IWebElement tblTaskList = driver.FindElement(By.Id("sts-mission-view-card-content"));
#endregion
#region Page Methods
#endregion
}
}
这是我看到的行为。在脚本期间的某个时刻,当我有两个窗口到我需要点击被测试的按钮时,我在切换回我不使用的窗口后得到NoSuchElement异常。这是代码:
//switch back to first window
driver1.SwitchTo().Window(winHandle1)
//load home page object and click the Automate button
mt1 = new MissionTab(driver1);
mt1.clickAutomate();
但奇怪的是,如果我只是尝试在我的脚本中使用虚拟IWebElement单独添加我需要的元素,它就可以正常工作。这是完成上述相同操作的代码。 switchTo切换回原始文件,但它不会识别(找到)任何页面对象。使用虚拟元素,我可以找到对象并毫无问题地对它们采取行动,我甚至不需要switchTo()语句。
//find the Automate button and click
IWebElement ele = driver1.FindElement(By.XPath("//*[@id='sts-mission-view-card-footer']/div/div/button[2]"));
ele.Click();
为什么会这样?有人注意到了吗?