0

同じクラスで 2 つの testng テストを作成しようとしています (Selenium webdriver を使用)。1 つはアプリケーションにログインし、もう 1 つは新しいアカウントを作成します。

これらは私が従う手順です - @BeforeClass を使用して、Firefox ブラウザでアプリケーションを開きます

@BeforeClass
public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "http://www.salesforce.com";
    driver.get(baseUrl + "/");
}
  • Web サイトにログインするための最初のテスト

    @Test
    public void testLogin() throws Exception {
    driver.findElement(By.id("username")).sendKeys(strUsername);
    driver.findElement(By.id("password")).sendKeys(strPassword);
    driver.findElement(By.id("Login")).click();
    

    }

  • 新しいアカウントを作成するための 2 回目のテスト

    @Test
    public void createAccount() throws Exception {
    driver.findElement(By.linkText("Accounts")).click();
    ************************
            ************************
            ************************
            ************************
            ************************
    

    }

私の問題は、この testng テストを実行すると、2 番目のテストで例外が発生することです: org.openqa.selenium.NoSuchElementException: 要素が見つかりません: {"method":"link text","selector":"Accounts"}

しかし、「driver.findElement(By.linkText("Accounts")).click();」というコマンドを含めると、testLogin() テストでは、動作します。すべてのテストを同じブラウザー セッションで実行したいと考えています。

任意の入力をいただければ幸いです。ありがとう。

4

3 に答える 3

1

@BeforeClass は、クラスに対して 1 回だけ実行されます。したがって、両方のテストを同じクラスに保持している場合、実行の順序は @beforeClass 、最初のテストケース、次に 2 番目のテストケースです (このテストに到達するまでにアカウント リンクが表示されるはずです)。

テストの順序は保証されません。そのため、アカウントのリンクがログイン後にしか表示されない場合は、ケースが常に通過するわけではない可能性があります。したがって、問題は

  1. createAccount() テストに到達するまでに要素が表示されない、または
  2. createAccount はログイン前に呼び出されるため、アカウント リンクは使用できません。

テストケースを特定の順序で実行する場合は、dependsOnMethods を使用して、createAccount を testLogin メソッドに依存させます。(依存メソッドのテストを参照)

于 2012-05-10T17:40:33.980 に答える
0

@BeforeClass は、個々のテストごとにセットアップ メソッドを実行します。そのため、テスト 1 では、新しい Firefox ブラウザーが作成され、ログインします。2 番目のテストでは、別の新しい Firefox ブラウザーが作成され、アカウント リンクを見つけようとします。これは、ログインしているときにのみ表示されると想定していますが、この時点では 2 番目のブラウザーはログインしていません。

あなたは@BeforeClassの後にいますか?

于 2012-05-10T16:40:57.567 に答える
0

2番目のテストメソッドが最初に実行されていると思います。「アカウント」リンクを取得するには、最初のメソッド (ログイン用) を実行する必要があります。testLogin が最初に実行され、次に createAccountMethod が実行されるように、2 番目のメソッドで dependsOnMethod を使用する必要があります。あなたの setUp() メソッドは @BeforeClass で問題ないようです。したがって、setUp() メソッドは変更しないでください。その他の 2 つのメソッドを次のように宣言します。

@Test
public void testLogin() throws Exception {
//your code here
}
@Test(dependsOnMethods{"testLogin"})
public void testCreateAccount() throws Exception {
//your code here
}

上記のコードでは、testLogin() が最初に実行され、次に testCreateAccount() メソッドが実行されるため、目的のクリック先のリンクを見逃すことはありません。

于 2012-08-11T07:15:58.383 に答える