WaitForElementClickable/可见 - Selenium C#

2023-12-06

我需要实现并修改我当前的方法来完成这两件事:

  • 等待元素可见 - (当前已实现,但仍使用预期状况这是过时的并且might be改变)
  • 等待可点击的元素 - (当我的测试运行时,它面临“加载圆圈”的问题,我按下按钮,在加载窗口之前,有一个加载程序,需要 1 到 4 秒,然后消失。我的目标是强制 Selenium 等待“XXX”时间,当加载完成时然后继续处理。

当前代码:

public static IWebElement WaitForElementVisible(this IWebDriver driver, By by, int timeoutInSeconds = 6)
    {
        IWebElement element;
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
        try
        {
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            element = wait.Until(ExpectedConditions.ElementIsVisible(by));
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(Configuration.ElementTimeout);
            return element;

        }
        catch (WebDriverTimeoutException e)
        {
            Console.WriteLine(e.ToString());
        }
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(Configuration.ElementTimeout);
        return null;
    }

基于不同的主题,我已经开始写一些东西,但不幸的是它只是副本......

我更愿意采用一种有价值的方法,其目标是检查这两件事。您能否给我任何建议/提示可以添加到该特定方法中?

//Edit

我添加了加载器代码的样子:

    <div class="Loader__background" style="display: block; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); z-index: 10;">
   <div class="Loader__foreground" style="display: table; width: 100%; height: 100%; text-align: center; z-index: 20; color: white;">
      <div class="Loader__message" style="display: table-cell; vertical-align: middle;">
         <div mode="indeterminate" value="0" min="0" max="100" style="position: relative; display: inline-block; width: 280px; height: 280px;">
            <div style="width: 280px; height: 280px; display: inline-block; transition: transform 10s linear 0ms; transform: rotate(1800deg);">
               <svg viewBox="0 0 280 280" style="width: 280px; height: 280px; position: relative;">
                  <circle cx="140" cy="140" r="137.5" fill="none" stroke-width="5" stroke-miterlimit="20" style="stroke: rgb(0, 188, 212); stroke-linecap: round; transition: all 750ms ease-in-out 0ms; stroke-dasharray: 604.757, 863.938; stroke-dashoffset: -259.181;"></circle>
               </svg>
            </div>
         </div>
      </div>
   </div>
</div>

我还将 @sers Java 建议转移到 C# 中:

public static IWebElement WaitForElementClickable(this IWebDriver driver, By by, int timeoutInSeconds)
    {
        new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)).Until(d =>
        {
            Boolean ajaxComplete;
            Boolean jsReady;
            Boolean loaderHidden = false;

            IJavaScriptExecutor js = (IJavaScriptExecutor)d;
            jsReady = (Boolean)js.ExecuteScript("return (document.readyState == \"complete\" || document.readyState == \"interactive\")"); ;

            try
            {
                ajaxComplete = (Boolean)js.ExecuteScript("var result = true; try { result = (typeof jQuery != 'undefined') ? jQuery.active == 0 : true } catch (e) {}; return result;");
            }
            catch (Exception)
            {
                ajaxComplete = true;
            }
            try
            {
                loaderHidden = !d.FindElement(by).Displayed;
            }
            catch (Exception) { }

            return ajaxComplete && jsReady && loaderHidden;
        });
    }

据我了解,当在屏幕上加载元素但覆盖您的元素时,您的元素是可见且可单击的,也许您还需要等待 javascript 完成才能成功单击。

您需要获得“加载圈”定位器。打开 chrome devtools 会触发“加载圆圈”出现,然后按 F8(暂停),然后您可以找到加载元素的 html。

等待加载元素消失:

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(8));
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingElementLocator);

您还可以检查 javascript 是否完整:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
bool jsLoaded = (bool)js.ExecuteScript("return (document.readyState == \"complete\" || document.readyState == \"interactive\")");

这里是Java的例子:

new WebDriverWait(driver, timeoutSec).until(d ->
{
    boolean ajaxComplete;
    boolean jsReady;
    boolean loaderHidden = false;

    JavascriptExecutor js = (JavascriptExecutor) d;
    jsReady = (boolean) js.executeScript("return (document.readyState == \"complete\" || document.readyState == \"interactive\")");;

    try {
        ajaxComplete = (boolean) js.executeScript("var result = true; try { result = (typeof jQuery != 'undefined') ? jQuery.active == 0 : true } catch (e) {}; return result;");
    } catch (Exception ignored) {
        ajaxComplete = true;
    }

    try {
        loaderHidden = !d.findElement(loadElementLocator).isDisplayed();
    } catch (Exception ignored) {}

    return ajaxComplete && jsReady && loaderHidden;
});

这是您更新的代码:

public static void WaitForLoading(IWebDriver driver, int timeoutInSeconds)
    {
        new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)).Until(d =>
        {
            Boolean ajaxComplete;
            Boolean jsReady;
            Boolean loaderHidden = false;

            IJavaScriptExecutor js = (IJavaScriptExecutor)d;
            jsReady = (Boolean)js.ExecuteScript("return (document.readyState == \"complete\" || document.readyState == \"interactive\")"); ;

            try
            {
                ajaxComplete = (Boolean)js.ExecuteScript("var result = true; try { result = (typeof jQuery != 'undefined') ? jQuery.active == 0 : true } catch (e) {}; return result;");
            }
            catch (Exception)
            {
                ajaxComplete = true;
            }
            try
            {
                loaderHidden = !d.FindElement(By.ClassName("Loader__background")).Displayed;
            }
            catch (Exception) { }

            return ajaxComplete && jsReady && loaderHidden;
        });
    }

如何使用:

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

WaitForElementClickable/可见 - Selenium C# 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 如何使用 Selenium 中的索引切换到窗口

    由于selenium不提供切换到窗口 多个窗口 的方法 但我想使用index html自定义方法来切换到不同的窗口 但下面的代码没有按预期工作 请建议以下方法的最佳实施 public void switchToWindowIndex int
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 当组件被销毁时,Angular 如何销毁事件处理程序和属性绑定

    我试图比我在文档中找到的内容更详细地了解 Angular 组件的销毁过程 我希望这里有人能够回答以下问题 在删除组件模板中元素的事件侦听器之前 是否会删除这些元素的属性 在组件的销毁过程中 事件监听器的注销何时以及如何发生 是否有更多关于
  • 将 Playframework 与 Java 结合使用时的父/子表单

    我有一个 问题 实体 它有一个 答案 其中有一个 替代方案 列表 如下所示 public class Question extends BaseEntity private String text private String source
  • 负向前瞻正则表达式

    我想匹配所有以 htm 结尾的字符串 除非它以 foo htm 结尾 我通常对正则表达式很熟悉 但负面的前瞻让我感到困惑 为什么这不起作用 foo htm i test foo htm returns true I want false 我
  • 将“exec()”与 NDK 一起使用

    我记得在某处读过 建议不要在 NDK 编译的 C 代码中使用 exec 推荐的方法是什么 我们是否尝试将 EXEC 代码推送到 Java 空间 也就是说 JNI 或应用程序 生成新进程 以及相关的将结果传递回 NDK 首先 不建议使用for
  • 是否可以在不使用 KeyContainerName 的情况下签署 xml 文档?

    我想创建 2 个非常简单的 dll 1 将签署一个xml文档 2 这将检查xml文档是否未被修改 我尝试使用 RSACryptoServiceProvider 和密钥容器 但是当我移动到另一台机器时 这不起作用 因为密钥存储在机器中 我想将
  • 如何在android服务类中获取上下文

    当我尝试从内存读取 XML 文件并将其写入对象时 出现以下错误 似乎获取上下文有问题 谁能告诉我我的代码有什么问题吗 Code public class WifiScanning extends Service private static
  • 使用 perl 的列宽自动调整功能

    我已经使用 perl 脚本使用一组 csv 文件生成了 Excel 工作表 我需要将列的宽度设置为auto fit 我应该做什么 我有在名为 OLE 的模块中执行此操作的方法 我不知道如何执行此操作 请帮助我 无法将文件的列设置为 自动调整
  • 为什么 JMenu 不总是在最上面?

    JMenu 表现正常 直到使用 JButton 更新 JFrame 上的 JTable 然后 JMenu 大部分被 JPanel 隐藏 见下图 当 JMenu 被选中时 它不应该总是在最上面吗 怎么就被推到后面了呢 更新 jButtonAd
  • Python 中的二分查找(二分查找)

    是否有一个库函数可以对列表 元组执行二分搜索 如果找到则返回该项目的位置 如果没有则返回 False 1 None 等 我在中找到了函数 bisect left right对分模块 但即使该项目不在列表中 它们仍然返回一个位置 这对于他们的
  • 匹配具有命名空间属性的 XML 元素时出现问题

    如果我要使用 xslt 将一段文本插入下面的 xml 中 条件语句会是什么样子
  • Java 泛型 - 无界通配符到底是什么?

    如果我有以下代码 public static void main String args List
  • 将辅助 X 轴标签添加到带有一个 X 轴的 ggplot

    编辑 这里有两个很好的解决方案 一个被标记为答案 但是 hrbrmstr提供了一个很好的解决方案 结合了两个ggplots 它非常适合这个简单的图 这是代码 breaks major lt c 0 15 37 5 52 5 67 5 82
  • Log4J 不在日志文件条目之间添加换行符

    我刚刚开始使用 log4j 我在读取属性文件和实际记录事件时没有问题 但它似乎将所有内容都附加到同一行的末尾 我的属性文件如下所示 A1 is set to be a ConsoleAppender log4j appender A1 or
  • Silverstripe 3.1.5 - 上传错误 SyntaxError:意外的标记 <

    我需要上传 svg 文件 为此 我将 svg 添加到我的 config yml 上传字段允许的扩展名以及 asset 中的 htacces 另外 我的所有资产目录都有 CHMOD 777 文件已上传但未附加 相反 我在上传字段中收到此错误语
  • 使用CSS调整图像大小

    我正在尝试仅使用 css 调整图像大小 它正在调整大小 但由于某种原因它没有拉伸到浏览器的 100 我想要的是它将调整给定高度的图像大小 但宽度在整个浏览器中应该为 100 我创建了一个小提琴作为演示 以便您可以看到发生了什么 div cl
  • BASH:错误消息未重定向到文件

    我有一个 bash 脚本 它只是调用不同的调用并将 stdout 和 stderr 输出重定向到不同的文件 我已经这样做了 command 1 gt datafile 2 gt gt errorfile 但是 当命令错误时 例如 作为参数给
  • 检查字符串列表 A 中的任何项目是否是字符串列表 B 中项目的子字符串

    我正在尝试对一组匹配器和一组字符串进行排序 这样如果我有 matchers foo bar abc and strings afooa zbarz abcabc purple foobar 我希望能够获得以下任何元素strings其中任意元
  • 如何在 Access 2010 中使用 .mdw 文件

    在 Access 2010 中 如何打开需要使用 mdw 文件的数据库 在 Access 2003 中创建 在 Access 2003 中 您必须首先引用 mdw 文件 我不知道如何在 Access 2010 中执行此操作 有人可以告诉我如
  • 获取ActiveMQ中的队列名称列表

    我尝试过下面的代码来获取 ActiveMQ 中的队列列表 但它不起作用 我的 ActiveMQ 有 4 个队列 try ActiveMQConnection makeConnection URL start Set
  • WaitForElementClickable/可见 - Selenium C#

    我需要实现并修改我当前的方法来完成这两件事 等待元素可见 当前已实现 但仍使用预期状况这是过时的并且might be改变 等待可点击的元素 当我的测试运行时 它面临 加载圆圈 的问题 我按下按钮 在加载窗口之前 有一个加载程序 需要 1 到