0

チェーンに「WaitFor」メソッドがあるように、C# Selenium webdriver アクション チェーンを拡張したいと考えています。

Selenium Webdriver のソースをチェックアウトして調べたところ、次のコード ブロックにたどり着きました。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.PhantomJS;
using OpenQA.Selenium.Support.UI;
using System;

namespace My.Selenium.Extensions
{
    public class Actions : OpenQA.Selenium.Interactions.Actions
    {
        public Actions(IWebDriver driver) : base(driver) { }
        //  NOTE: this line is the GOAL state 
        //     I would like to be able to call to the WebDriver OR to pass in  
        //     an IWebElement along with an anonymous code evaluation
        //     by using the selenium DefaultWait<T> class this should allow
        //     dynamic chaining of events while including waits for more complex
        //     action execution
        //  public Actions WaitFor<T>(T element, Func<T, TResult> condition)

        // NOTE2: this is the only version that will both compile and can be
        //        successfully called via the "test" below
        public Actions WaitFor<T>(T element, Func<T, T> condition)
        {
            DefaultWait<T> wait = new DefaultWait<T>(element);
            wait.Until(condition);
            return this;
        }
    }

    [TestClass]
    public class ActionTests
    {
        [TestMethod]
        public void WaitForTest() {
            IWebDriver driver = new PhantomJSDriver();
            IWebElement bar = driver.FindElement(By.Id("bar"));
            Actions a = new My.Selenium.Extensions.Actions(driver);
            // Note that this will pass the compiler test, but does 
            // not necessarily work as intended
            a.WaitFor(bar, (foo) => { return foo.FindElement(By.CssSelector("table")); } );
            // what I would ideally like to do is more like:
            // a.WaitFor(bar, (bar) => { return bar.GetCssValue("opacity") == "1.0"; } );
        }
    }
}

上記のコードはコンパイルされます (ただし、実際に意図したとおりに動作するかどうかはわかりません)。

私の最終的な目標は、現在の C# webdriver の「標準」またはラムダ構文評価ExpectedConditionsを使用した独自の動的評価を使用して、その場で「waitfor」条件を動的に作成できるようにすることです。IWebElement

私の問題タイプまたは名前空間 T2 が見つからないと言われているためWaitFor<T>、上記のクラスの宣言にあるようです。Func<T,T2>

プロジェクトのソースはこちら: https://code.google.com/p/selenium/source/browse/

いくつかの関連するクラスで

https://code.google.com/p/selenium/source/browse/dotnet/src/webdriver/Interactions/Actions.cs

https://code.google.com/p/selenium/source/browse/dotnet/src/support/UI/DefaultWait.cs

私がモデル化しようとしている例:

予想される条件: https://code.google.com/p/selenium/source/browse/dotnet/src/support/UI/ExpectedConditions.cs

および WebDriverWait: https://code.google.com/p/selenium/source/browse/dotnet/src/support/UI/WebDriverWait.cs

4

1 に答える 1

2

このWaitForメソッドは、パラメーターとして受け取るのと同じ型のオブジェクトを返す関数を想定しています。

public Actions WaitFor<T>(T element, Func<T, T> condition)

提供された関数を適切な条件付きにしたい場合は、このバージョンのメソッドを試してください。

public Actions WaitFor<T>(T element, Func<T, bool> condition)
{
    DefaultWait<T> wait = new DefaultWait<T>(element);
    wait.Until(condition);
    return this;
}

boolまたは、より一般的な形式の場合 (駄洒落を許す場合)、次のように明示的なものを 2 番目のジェネリック型のプレースホルダーに置き換えることができます。

public Actions WaitFor<T, U>(T element, Func<T, U> condition)
{
    DefaultWait<T> wait = new DefaultWait<T>(element);
    wait.Until(condition);
    return this;
}
于 2013-10-16T21:42:54.623 に答える