Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebDriverWait没有等待我指定的元素_C#_Selenium_Selenium Chromedriver_Webdriverwait - Fatal编程技术网

C# WebDriverWait没有等待我指定的元素

C# WebDriverWait没有等待我指定的元素,c#,selenium,selenium-chromedriver,webdriverwait,C#,Selenium,Selenium Chromedriver,Webdriverwait,我试图让我的代码在尝试从元素获取文本之前等待元素出现。如果我一步一步地遍历代码,允许元素时间出现,它将按预期工作,但是如果我在没有断点的情况下运行它,等待将被忽略,并引发异常 我不明白为什么它被忽视了 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); IWebElement message = wait.Until(driver => driver.FindElement(By.ClassNa

我试图让我的代码在尝试从元素获取文本之前等待元素出现。如果我一步一步地遍历代码,允许元素时间出现,它将按预期工作,但是如果我在没有断点的情况下运行它,等待将被忽略,并引发异常

我不明白为什么它被忽视了

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
IWebElement message = wait.Until(driver => driver.FindElement(By.ClassName("block-ui-message")));
string messageText = message.Text;

作为替代方案,您可以为
元素isvisible()
导入WebDriverWait,并且可以使用以下内容:


DotNetSeleniumExtras.WaitHelpers
nuget
一起使用: 并不是很清楚你所说的我需要的具体使用指令的确切含义。如果您使用SeleniumExtras和WaitHelpers,您可以使用以下解决方案:

string messageText = new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.ClassName("block-ui-message"))).GetAttribute("innerHTML");

下面的示例代码将等待元素出现

        private bool IsElementPresent(By by)
        {
            try
            {
                _driver.FindElement(by);
                return true;
            }
            catch (NoSuchElementException)
            {
                return false;
            }
        }

        private void WaitForReady(By by)
        {
            var wait = new WebDriverWait(_driver, TimeSpan.FromHours(2));
            wait.Until(driver =>
            {
                //bool isAjaxFinished = (bool)((IJavaScriptExecutor)driver).ExecuteScript("return jQuery.active == 0");
                return IsElementPresent(by);
            });
        }

      // ...
      // Usage
      WaitForReady(By.ClassName("block-ui-message")); // It will wait until element which class name is 'block-ui-message' is presented to page

你得到的是什么类型的异常?我得到的是
NoTouchElementException
,但是元素在那里,因为它在缓慢地遍历代码时工作正常。我尝试了这个,但是,
ExpectedConditions
部分出现问题-是否有我需要的使用指令的特定
?@Northers检查更新的答案并告诉我状态。我也遇到同样的问题,只是用了不同的措辞——“SeleniumExtras这个名字在当前上下文中不存在”似乎你搞乱了两件事:1)你的问题是从“要出现的元素”开始的2)使用您提到的ExpectedConditions
指令
3)使用SeleniumExtras.WaitHelpers您所说的…名称SeleniumExtras不存在。。。。4) 在您提到的另一个答案中,与元素交互。您的确切用户案例是什么?您试图自动化的手动步骤是什么?好的,我只需要等待元素出现在屏幕上,这样我就可以与它交互,在这种情况下,我需要从元素中提取文本。元素最终会出现在屏幕上,如果我一步一步地执行,我可以很容易地获得文本,我只需要代码等待,直到对象以我可以与它交互的方式出现,这样它就可以运行,而无需我一步一步地执行。这种方法很好,谢谢。你知道为什么我的方法不起作用吗?@Northers当你通过lambda函数创建自己的
ExpectedCondition
时,它以不同的方式工作。在您的情况下,Selenium需要
IWebElement
null
。然而,它得到了
NoSuchElementException
。如果你像SuxrobGM那样将代码放入
try catch
块中,那就行了,Kay,我的回答还不成熟-使用上面的代码不再给我带来异常,确实会等待元素出现,但只出现在DOM中,所以我当时无法与元素交互。是否有替代FindElement的方法来确保代码等待元素在屏幕上实际可见,从而允许交互?使用异步方法。更改上述代码并实现
async/await
方法
        private bool IsElementPresent(By by)
        {
            try
            {
                _driver.FindElement(by);
                return true;
            }
            catch (NoSuchElementException)
            {
                return false;
            }
        }

        private void WaitForReady(By by)
        {
            var wait = new WebDriverWait(_driver, TimeSpan.FromHours(2));
            wait.Until(driver =>
            {
                //bool isAjaxFinished = (bool)((IJavaScriptExecutor)driver).ExecuteScript("return jQuery.active == 0");
                return IsElementPresent(by);
            });
        }

      // ...
      // Usage
      WaitForReady(By.ClassName("block-ui-message")); // It will wait until element which class name is 'block-ui-message' is presented to page