1

オブジェクトロケーターのみを渡すことによって、オブジェクトロケーターのタイプを見つける方法はありますか。たとえば、ログイン ボタンをクリックする必要がid=loginありclassname=loginbuttonますxpath=//input[@name='login']。オブジェクトロケータ(IDまたは名前のいずれか)を入力として渡すだけのメソッドを構築する必要があり、そのタイプ(IDまたは名前のいずれか)はメソッドで決定する//必要があります。

タイプを返す objectLocator() をfindElement()

WebElement element = driver.findElement(objectLocator());
4

5 に答える 5

2

すぐに入手できるとは思いません。独自のロジックを実装する必要があります。

唯一のことは、リンクテキストで検索したいとしましょう。ユースケースに従って、オブジェクトリポジトリで「これは私のリンクテキストです」と指定します。
それが ID なのか、名前なのか、リンクテキストなのか、どうやってわかるのでしょうか?

xpath の場合、/ で始まるかどうかを確認してから、xpath を指定できます。その唯一のIDまたは名前であれば、ByIdorNameを使用できますが、cssとlinktextではトリッキーになると思います.

私が考えることができる1つのことは、linktext = blah blahでlcoator定義の前にlinktextである場合、それを分割して消費するなど、ある種の規則を確立できることです。

于 2013-03-06T10:34:57.007 に答える
1

これを行う最新の方法は、PageFactoryPageObjectsを使用することです。

以下は、セレン ロケーター文字列を WebDriver ロケーターに適合させる簡単で汚れたものです。

    public enum LocatorType {
         CLASSNAME, CSS, ID, LINK, NAME, TAGNAME, XPATH ;
    }

    public WebElement objectLocator(LocatorType type, String ref) {
    switch(type) {
    case ID:
        return this.webDriver.findElement(By.id(ref));
    case CLASSNAME:
        return this.webDriver.findElement(By.className(ref));
    case XPATH:
        return this.webDriver.findElement(By.xpath(ref));
    case CSS:
        return this.webDriver.findElement(By.cssSelector(ref));
    case LINK:
        return this.webDriver.findElement(By.linkText(ref));
    case NAME:
        return this.webDriver.findElement(By.name(ref));
    case TAGNAME:
        return this.webDriver.findElement(By.tagName(ref));
    }
    return null;
    }

    public WebElement objectLocator(String identifier) {
    String typeString = identifier.substring(0, identifier.indexOf('='));
    String ref = identifier.substring(identifier.indexOf('=')+1, identifier.length());
    if (typeString.toLowerCase().contains("classname")) {
        return objectLocator(LocatorType.CLASSNAME, ref);
    } else if (typeString.toLowerCase().contains("css")) {
        return objectLocator(LocatorType.CSS, ref);
    } else if (typeString.toLowerCase().contains("id")) {
        return objectLocator(LocatorType.ID, ref);
    } else if (typeString.toLowerCase().contains("link")) {
        return objectLocator(LocatorType.LINK, ref);
    } else if (typeString.toLowerCase().contains("name")) {
        return objectLocator(LocatorType.NAME, ref);
    } else if (typeString.toLowerCase().contains("tagname")) {
        return objectLocator(LocatorType.TAGNAME, ref);
    } else if (typeString.toLowerCase().contains("xpath")) {
        return objectLocator(LocatorType.XPATH, ref);
    } else {
        return null;
    }
}
于 2013-03-06T14:20:15.563 に答える
1

すべてのロケーターを By オブジェクトとして保存し、必要に応じて By を直接使用するか、By をメソッドに渡すと非常に便利です。例えば:

By passwordField= By.id("login");
By userNameField = By.name("username");
By submitButton = By.xpath("\\myxpath\div[2]");


public void clickLogin() {
   driver.findElement(submitButton).click();
}

また、他のクラスの静的 Bys も使用します。

public void clickLogin() {
   driver.findElement(LoginPage.SUBMIT_BUTTON).click();
}
于 2013-03-06T20:00:45.777 に答える
0

このソリューションを探しているようです。これは、何らかのプロパティ ファイルまたは xml のコードの外部にオブジェクト リポジトリが保持されているためです。

Using gui maps has lot of disadvantages like,

- maintain an external file with a list of locators
- parse locator files to read keys (you can abstract this but still an overhead)
- when writing PageObjects you need to switch back and forth from Page to gui map
- possibility of multiple duplicate locators in gui maps
- object repo grows over time and becomes impossible to maintain
- debugging is far more difficult

あなたが探しているのは、私の意見では必要のない複雑さのレイヤーをもう1つ追加することです。ブラウザーの自動化はそれ自体が課題であり、保守可能なテスト自動化コードを作成することが最も重要です。

ページ オブジェクトでPageFactoryを使用します。

- Natural place for your locators are Page Objects themselves. 
- Locators easily accessible in page objects for review or correction
- No need for explicit driver.findElement, with @FindBy you get that for free
- modern Java and awesome annotations make page objects look beautiful & readable

以前に gui マップを使用したことがありますが、かなり苦労しました。ページ ファクトリに切り替えて、オブジェクト リポジトリを使用するのは非常に悪い考えであることに気付きました。

于 2013-03-10T23:56:59.577 に答える