0

I have a collection of records on a web page, and when a record is clicked, a 'Delete' link is displayed (actually 'unhidden' as its actually always there).

When trying to access this 'Delete' link, I am using its value.

When I use Driver.FindElement, it returns the first Delete link, even though it's hidden, and therefore can't click it (and shouldn't as it is not the right link).

So, what I basically want to do is find only non-hidden links. The code below works, but as it iterates through every Delete link I am afraid it may be inefficient.

Is there a better way?

public class DataPageModel : BasePageModel
{
    private static readonly By DeleteSelector = By.CssSelector("input[value=\"Delete\"]");

    private IWebElement DeleteElement
    {
        get
        {
            var elements = Driver.FindElements(DeleteSelector);
            foreach (var element in elements.Where(e => e.Displayed))
            {
                return element;
            }
            Assert.Fail("Could not locate a visible Delete Element");
            return null;
        }
    }
}
4

1 に答える 1

1

@Torbjornに同意しますが、最適化に時間を費やす場所にうんざりする必要がありますが、このコードは少し非効率的だと思います。

基本的に、コードの速度を低下させているのは、各要素を前後にチェックして、表示されているかどうかを確認することです。コードを高速化するには、必要な要素を一度に取得する必要があります。

2つのオプション(どちらもJavaScriptを使用):

jQuery

jQueryセレクターをSeleniumに取り込むさまざまな方法を見てください(私はここでそれについて書きました)。それができたら、jQueryの:visibleセレクターを利用できます。

または、ページにすでにjQueryがロードされていることが確実で、余分なコードをすべて実行したくない場合は、次を使用できますExecuteScript

IWebElement element = (IWebElement)driver.ExecuteScript("return $('input[value=\"Delete\"]:visible').first().get(0)");

Javascript

jQueryを避けたい場合は、JavaScript関数を記述して、C#で現在行っているのと同じことを行うことができます。可能なすべての要素を取得し、最初に表示される要素を返します。

次に、同様のことを行います。

string script = //your javascript
IWebElement element = (IWebElement)driver.ExecuteScript(script);

どのオプションを選択するかによって、読みやすさの程度は異なりますが、すべてがより効率的であるはずです。もちろん、これらはすべてブラウザでjavascriptを有効にする必要があります。

于 2012-04-17T15:43:32.977 に答える