web-dev-qa-db-ja.com

Webdriver C#で要素がクリック可能になるまで待機する方法

このiが問題に直面しているため、ブラウザで要素が生成された後、数秒間すべての要素をカバーするブロックUiがあります。ブロックUIで受信。私は待機まで使用しようとしましたが、私は助けなかったので、C#webdriverでisClickAbleを見つけることができます

   var example = _wait.Until<IWebElement>((d) => d.FindElement(By.XPath("Example")));
   var example2 = _wait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(By.XPath("Example")));
example.click();
example2.click();

IsClickAbleに相当するC#がありますか、事前に感謝します

15
Anand S

Javaソースをよく見ると、基本的に「クリック可能」かどうかを判断するために2つのことを行っていることがわかります。

https://code.google.com/p/Selenium/source/browse/Java/client/src/org/openqa/Selenium/support/ui/ExpectedConditions.Java

まず、標準の_ExpectedConditions.visibilityOfElementLocated_を使用して「可視」かどうかを確認し、次にelement.isEnabled()trueであるかどうかを確認します。

これはわずかに凝縮することができます、これは基本的に(簡略化、C#で)を意味します:

  1. 要素がDOMから返されるまで待ちます
  2. 要素の_.Displayed_プロパティがtrueになるまで待ちます(これは基本的にvisibilityOfElementLocatedがチェックしているものです)。
  3. 要素の_.Enabled_プロパティがtrueになるまで待ちます(これは基本的にelementToBeClickableがチェックしているものです)。

私はこれをそのように実装します(ExpectedConditionsの現在のセットに追加しますが、それを行う方法は複数あります:

_/// <summary>
/// An expectation for checking whether an element is visible.
/// </summary>
/// <param name="locator">The locator used to find the element.</param>
/// <returns>The <see cref="IWebElement"/> once it is located, visible and clickable.</returns>
public static Func<IWebDriver, IWebElement> ElementIsClickable(By locator)
{
    return driver =>
    {
        var element = driver.FindElement(locator);
        return (element != null && element.Displayed && element.Enabled) ? element : null;
    };
}
_

次のようなもので使用可能:

_var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
var clickableElement = wait.Until(ExpectedConditions.ElementIsClickable(By.Id("id")));
_

ただし、clickableが何を意味するかについて別の考えがあるかもしれません。その場合、このソリューションは機能しない可能性があります-しかし、それは何の直接的な翻訳ですJavaコードはやっています。

32
Arran

これがクリック可能かどうかを確認するために使用するコードです。それ以外の場合は、別のURLに移動します。

if (logOutLink.Exists() && ExpectedConditions.ElementToBeClickable(logOutLink).Equals(true))
            {
                logOutLink.Click();
            }
            else
            {
                Browser.Goto("/");
            }
2
Phil Hudson

「別の要素がクリックを受け取る」などの問題がある場合、この回避方法は、そのオーバーレイボックスが消えるのを待つwhileループを使用することです。

//The below code waits 2 times in order for the problem element to go away.
int attempts = 2;
var elementsWeWantGone = WebDriver.FindElements(By.Id("id"));
while (attempts > 0 && elementsWeWantGone.Count > 0)
{
    Thread.Sleep(500);
    elementsWeWantGone = WebDriver.FindElements(By.Id("id"));
}
1
tetenal

低速のテストランナーコンピューターでは、入力要素が最初に検索できるように見えましたが、スクリプトがキーまたはクリックを入力コントロールに送信しようとした時点ではクリックできませんでした。 「ElementToBeClickable」を待つのが助けになりました。より高速で強力なテストランナーシステムでは、この問題はほとんどありませんでした。

これは、C#ベースのSeleniumテストで改善されたと思われる、少しコンテキストのあるコードです。また、SpecFlowとxUnitを使用します。 IE11とIEDriverServer.exeを使用しています。

2019年5月現在、これを含むNuGetパッケージはDotNetSeleniumExtras.WaitHelpersです。

キーラインはこれです:

wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By ...

やり取りする最初の入力フィールドを指すセレクターを使用して、新しいページの最初の入力フィールドに対してこれを行います。 (By.XPath( "")

[Given(@"I have selected the link to the OrgPlus application")]
public void GivenIHaveSelectedTheLinkToTheOrgPlusApplication()
{
    _driver.Navigate().GoToUrl("http://orgplus.myorg.org/ope?footer");
}

[Given(@"I have selected the link to the OrgPlus Directory lookup")]
public void GivenIHaveSelectedTheLinkToTheOrgPlusDirectoryLookup()
{
    var wait = new WebDriverWait(_driver, new TimeSpan(0, 0, 30));
    var element = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id=\"lnkDir\"]")));
    IWebElement btnSearch = _driver.FindElement(By.XPath("//*[@id=\"lnkDir\"]"));
    btnSearch.SendKeys(Keys.Enter);
}
0
Developer63

私はこの問題に直面し、要素がクリック可能で表示されているかどうかを確認するだけでは不十分で、Seleniumはまだ待機していませんでした。

私のケースで見つけた唯一の解決策は悪い習慣でしたが、回避策として機能しました。ここでFalgun Contの応答にあるように、Try/Catchでループ内の要素を取得しようとします:

StackExchange-C#を使用したWebDriverで要素がクリック可能になるまで待機する方法

0
Laura Vieira