私が抱えている問題は、親クラス(BasePage)から継承したクラス(ページ)がたくさんあることです。子クラスを初期化するときはいつでも、WaitForLoadingToStop()というメソッドを実行する必要があります。どのように私はこのメソッドを継承し、それは私の子クラスのコンストラクタへの実装ですか?継承するクラスがそのコンストラクタでメソッドを実装するように強制するにはどうすればいいですか?
これは私が変更が必要なのは、場所のいたるところに複製されているためです。したがって、クラスが作成されたときに自動的に継承され実行されます。
var assPage = new StudentAssesmentPage(Driver);
assPage.WaitForLoadingToStop();
これはサンプルの子クラスで、私は以下は、この
public class StudentAssesmentPage : BasePage<StudentAssesmentPageObjectRepository>
{
public StudentAssesmentPage(IWebDriver driver) : base(driver, new StudentAssesmentPageObjectRepository(driver))
{}
}
のように見える10人を持っている私のBasePageクラスクラスはジャスト基本クラスから継承
public abstract class BasePage<TObjectRepository> where TObjectRepository : BasePageObjectRepository
{
protected WebDriverWait Wait { get; }
protected IWebDriver Driver { get; }
protected ApplicationUrls ApplicationUrls { get; }
public IJavaScriptExecutor JavascriptExecutor { get; }
protected Actions UserInteractions { get; private set; }
protected By _loadingSpinnerLocator = By.Id("spinner");
private readonly double LOADING_SPINNER_TIMEOUT = 60;
private TObjectRepository _objectRepository;
public BasePage(IWebDriver driver, TObjectRepository repository)
{
Driver = driver;
_objectRepository = repository;
UserInteractions = new Actions(Driver);
ApplicationUrls = new ApplicationUrls();
Wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(GetPageTimeout()));
JavascriptExecutor = Driver as IJavaScriptExecutor;
}
internal TObjectRepository ObjectRepository
{
get { return _objectRepository; }
}
protected bool WaitForLoadingToStop(int secondsToSleep = 5)
{
var sleepTime = TimeSpan.FromSeconds(secondsToSleep);
Reporter.Debug($"{Helpers.GetCurrentMethodName()}. Going to sleep for:{sleepTime.Seconds}");
Thread.Sleep(sleepTime);
Reporter.Debug($"Now, going to wait for loading spinner for:{LOADING_SPINNER_TIMEOUT} seconds.");
var basePageWait = new WebDriverWait(Driver, TimeSpan.FromSeconds(LOADING_SPINNER_TIMEOUT));
basePageWait.Message =
$"Waited for {LOADING_SPINNER_TIMEOUT}sec for the spinner. However, it took longer than that for the application to load.";
return basePageWait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.XPath("//img[@src='/Content/images/spinner.gif']")));
}
}
混乱しています... WaitForLoadingToStopは基本クラスの一部ですが、上記のサンプルではインスタンスなしで直接呼び出しています。あなたは 'assPage.WaitForLoadingToStop()...'を意味しましたか? –
おっと、それを指摘してくれてありがとう。 –
あなたの質問は理にかなっていません。 'WaitForLoadingToStop()'は 'protected'ですが、明らかに宣言クラス外のコードから呼び出されていますか?いずれにしても、コンストラクターが時間を浪費するのは悪い考えです。長い初期化を扱う通常の方法は、ファクトリメソッドを書くことです。あなたはそこに待つことができ、さらには全体を非同期にすることもできます。あなたの質問がこれまで述べてきたように、各子クラスのコンストラクタにその呼び出しを入れる以外に、それがどのように動作するかははっきりしません。 –