使用 C# 在 WebDriver 中打开新窗口

2023-12-08

EDIT 4:

enter image description here EDIT 3 enter image description here

EDIT 2

    string currentWindow = driver.CurrentWindowHandle;

    driver.SwitchTo().Window("");
    string childTitle = driver.Title;

    driver.SwitchTo().Window(currentWindow);
    string parentTitle = driver.Title;

上面的代码为我提供了父窗口或子窗口相同的标题。

EDIT:

<a id="ctl00_ctl00_Features_ctl03_lnkPage" class="title" target="_blank" href="websiteaddress">Stay  Around</a>

如何验证新打开的窗口的标题,并在验证后关闭打开的新窗口?

因此,在我的页面中,我有一个链接,单击该链接会打开一个新窗口,现在我不确定如何验证该窗口的标题。

这是我到目前为止所做的。

GoToMysiteUrl();
IWebElement addtoList = driver.FindElement(By.XPath(_pageName));
addtoList.Click();

//它打开一个新窗口

现在我想将焦点切换到新窗口并验证标题并关闭新窗口 返回上一个窗口。


大多数人在处理 IE 中的弹出窗口时会忽略的一点是,元素上的单击是异步的。也就是说,如果你检查.WindowHandles单击后立即更改属性,您可能会失去竞争条件,因为您在 IE 有机会创建新窗口之前检查是否存在新窗口,并且驱动程序有机会注册它的存在。

下面是我用来执行相同操作的 C# 代码:

string foundHandle = null;
string originalWindowHandle = driver.CurrentWindowHandle;

// Get the list of existing window handles.
IList<string> existingHandles = driver.WindowHandles;
IWebElement addtoList = driver.FindElement(By.XPath(_pageName));
addtoList.Click();

// Use a timeout. Alternatively, you could use a WebDriverWait
// for this operation.
DateTime timeout = DateTime.Now.Add(TimeSpan.FromSeconds(5));
while(DateTime.Now < timeout)
{
    // This method uses LINQ, so it presupposes you are running on
    // .NET 3.5 or above. Alternatively, it's possible to do this
    // without LINQ, but the code is more verbose.
    IList<string> currentHandles = driver.WindowHandles;
    IList<string> differentHandles = currentHandles.Except(existingHandles).ToList();
    if (differentHandles.Count > 0)
    {
        // There will ordinarily only be one handle in this list,
        // so it should be safe to return the first one here.
        foundHandle = differentHandles[0];
        break;
    }

    // Sleep for a very short period of time to prevent starving the driver thread.
    System.Threading.Thread.Sleep(250);
}

if (string.IsNullOrEmpty(foundHandle))
{
    throw new Exception("didn't find popup window within timeout");
}

driver.SwitchToWindow(foundHandle);

// Do whatever verification on the popup window you need to, then...
driver.Close();

// And switch back to the original window handle.
driver.SwitchToWindow(originalWindowHandle);

顺便说一句,如果您使用 .NET 绑定,您可以访问PopupWindowFinderWebDriver.Support.dll 程序集中的类,它使用非常相似的方法来定位弹出窗口。您可能会发现该类完全满足您的需求,并且无需修改即可使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C# 在 WebDriver 中打开新窗口 的相关文章

随机推荐

  • Haskell 中的类型比较

    我还在学习 Haskell 的基础知识 我试图找到这个简单问题的答案 所以我提前道歉 因为我确信它很简单 Given data Fruit Fruit Apple Orange deriving Show Eq a Apple 如何检查某个
  • 按百分比设置位置 - Android DisplayMetrics

    我喜欢对应用程序中的所有位置使用百分比 我总是使用相同的系统 我是android编程新手 这是班级 public class SCREEN DisplayMetrics dm new DisplayMetrics Point size ne
  • React/Redux 下载文件

    单击按钮时我需要从服务器下载文件 我创建了一个 MaterialUI 按钮 并在其 onclick 回调上调用容器组件的操作连接的 该操作是异步的 并执行 ajax POST export const onXlsxClick gt disp
  • 如何设置material-ui TextField 仅接受十六进制字符

    我希望我的 TextField 仅接受 0 9 和字母 A F 的值 谢谢
  • 如何更改此代码以允许附加到列表?

    我在这段代码之后附加或实际上打印任何内容时遇到问题 reversedPriv 52 27 13 6 3 2 array 9 var 0 numA for i in array for j in reversedPriv while var
  • 如何使用 awk 或 sed 递归查找/替换字符串?

    如何查找并替换每次出现的情况 subdomainA example com with subdomainB example com 在每个文本文件中 home www 目录树递归 find home www type d name git
  • Xcode 退出时找不到 Parse/Parse.h 文件

    我在我的项目中添加了 Parse SDK 一切都很好 然而 当我退出 Xcode 并打开项目时 我收到以下错误 Parse Parse h file not found 我删除了 Parse Framework 并将其重新添加到我的项目中
  • 使用委托或 lambda 封装秒表计时?

    我正在编写这样的代码 做了一些快速而肮脏的计时 var sw new Stopwatch sw Start for int i 0 i lt 1000 i b DoStuff s sw Stop Console WriteLine sw E
  • 将字节存储到寄存器 x86-64 程序集中的问题

    我正在尝试编写一个函数来确定作为第一个参数给出的字符串的长度 因此 rdi 将包含 char ptr 当我打电话时movb rdi rcx将 rdi 指向的字符移动到 rcx 中 出现以下错误 incorrect register rdx
  • Android MediaRecorder Video - 随后播放音频和视频轨道

    我遇到了一个错误 主要出现在三星设备上 我用媒体记录器录制视频 代码如下所示 它在所有设备上都能完美运行 但现在在某些 Android 设备上 音频和视频轨道是分开的 假设我正在捕捉 5 秒的视频 视频时长为 5 秒 播放视频将播放视频的第
  • 使用ajax发送base64图像

    我正在尝试从画布中生成图像 并通过 ajax 发出的 POST 请求将其发送到服务器 我正在使用 html2canvas 将 div 转换为 canvas 并使用 toDataURL 将其转换为 base64 这是我的JS function
  • 如何在 XPath 中使用 AND 运算符?

    XML 就像 a b value1 b b value2 b a 我想写 XPath 来查找 id a 那里会有两个 b 具有固定值的子节点value1 and value2 我试图找出 XPath 的条件如下 xml gt xpath b
  • 在 Objective-C 中如何在视图控制器之间传递对象?

    我花了两天时间艰难地研究一些代码 试图找出为什么我无法获取我在 h 中声明并在 m 中实现并在 viewDidLoad 函数中设置的全局 NSMutableArray 变量 我终于明白了 Objective C 中不存在全局变量这样的东西
  • 横向启动应用程序会导致启动时旋转

    我已经实现了shouldAutorotateToInterfaceOrientation 并且在我的应用程序运行后 在条款或方向更改方面一切正常 但是 我不喜欢我的应用程序首次启动时的行为 当我以纵向启动我的应用程序时 它会按预期打开 但是
  • 如何确定 Android 中的语音信箱电话号码

    如何在 Android 代码中确定手机的语音信箱号码 您可以在 TelephonyManager 类中使用 getVoiceMailNumber 请注意 这可能不适用于所有手机提供商 Android 电话管理器
  • 如何将 .dds 文件加载到图片框中?

    如何在 C 中将 dds 纹理文件加载为图像 我在谷歌上找不到任何有用的东西 你给我的信息和样本越多 我就越能理解它 我遇到过同样的问题 这是一个很好的解决方案 Source http www mastropaolo com devildo
  • Azure 数据工厂:事件未启动管道

    我已经设置了一个包含复制活动的 Azure 数据工厂管道 出于测试目的 源和接收器都是 Azure Blob 存储 我不想在源 Azure Blob 存储上创建新文件后立即执行管道 我创建了 BlovEventsTrigger 类型的触发器
  • 类型 Set 不带参数

    package set import java util public class Set public static void main String args String things appple bob ham bob bacon
  • 使用 decltype() 和三元运算符有条件地选择类型

    我有一个文件a cpp include
  • 使用 C# 在 WebDriver 中打开新窗口

    EDIT 4 EDIT 3 EDIT 2 string currentWindow driver CurrentWindowHandle driver SwitchTo Window string childTitle driver Tit