web-dev-qa-db-ja.com

C#Selenium 'ExpectedConditionsは廃止されました'

ExpectedConditionsを使用して要素が表示されるのを明示的に待機しようとすると、Visual Studioは現在廃止されており、まもなくSeleniumから削除されることを警告しています。

同じ結果を達成する現在/新しい方法は何ですか?

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));
41
David Stampher

私は自分の質問を解決し、Seleniumの最新バージョンでこれを解決する方法を知りたいと思っている人に答えを提供したかったのです。

Nugetを使用してDotNetSeleniumExtras.WaitHelpersを検索し、その名前空間をクラスにインポートします。これで次のことができます。

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.Id("content-section")));

そして、IDEの警告はなくなります。

70
David Stampher

追加のnugetパッケージをダウンロードしたくない場合、特にラムダ式を使用して、独自の関数(または条件)を宣言するのは非常に簡単です。

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(condition =>
{
    try
    {
        var elementToBeDisplayed = driver.FindElement(By.Id("content-section"));
        return elementToBeDisplayed.Displayed;
    }
    catch (StaleElementReferenceException)
    {
        return false;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
});

これは非常に汎用的です。これは、あらゆる種類のブール式を評価できるようになったためです。

11
Rob F.

それは非常に簡単で、変更するだけです

Wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));

Wait.Until(c => c.FindElement(By.Id("content-section")));
10
Everton Rocha

匿名関数に変更する答えは、最も正しいものです。または、必要な待機条件を独自に作成します。上記の明示的なシナリオで匿名関数を使用する例は次のようになります...

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
wait.IgnoreExceptions(typeof(NoSuchElementException), typeof(ElementNotVisibleException));
var element = wait.Until(() => 
{
    var e = Driver.FindElement(By.Id("content-section"));
    if(e.Displayed)
        return e;
});

そして、その時点で、呼び出すことができるソリューションのあるクラスでは、関数自体がそれ自体でオフになる可能性があります。これの良いところは、必要に応じて変更できることです。本当に貧弱なウェブサイトがExpectedConditionsの仕組みを壊してしまうケースをいくつか見てきましたが、チームが独自の関数を作成することで解決しました。

C#寄稿者によると:

ExpectedConditionsに関しては、これも.Javaで「Javaが持っている」という理由だけで作成された追加です。 JavaのExpectedConditionsクラスが作成された時点で、ラムダ関数(またはそのように動作するもの)を作成するための構文は特に難解で理解しにくいものでした。その場合、ヘルパークラスはJavaバインディングにとって非常に意味がありました。ただし、C#はJavaではありません。 C#では、ラムダ関数(Microsoftのドキュメントの言語で「匿名メソッド」)を作成するための構文は長年C#開発者によく理解されており、武器庫の標準ツールです。

この場合、コードの冗長性の問題にはいくつかのメリットがありますが、待機条件が万能であることがめったにないため、ユーザーが待機条件を持つ独自の条件クラスを開発する方がはるかにクリーンなアプローチになりますしかし、これはユーザーが嫌いなものです。さらに、特定の待機条件の実装の「標準」コレクションの考えは一見良いアイデアのように見えますが、ユーザーが特定の条件を機能させたい方法にはかなりのバリエーションがあります。待機条件のコレクションを持つことは良いことかもしれませんが、Seleniumプロジェクトはその場所ではありません。

http://jimevansmusic.blogspot.com/2018/03/deprecating-parts-of-seleniums-net.html

2
PandaMagnus

Nugetが必要-DotNetSeleniumExtras.WaitHelpers

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("")));

要素のクリック可能なイベントを示しました。同様に、他のイベントを必須パラメーターとともに使用できます。これが役立つことを願っています

1
Krunal Patel

selenium.SupportおよびSelenium.WebDriver NuGetパッケージのどのバージョンがインストールされているかを確認してください。現在、最新バージョン3.11.2で同じ問題が発生し、3.10.0にダウングレードすると問題が修正されました。

0
martin pb