2017-03-24 69 views
-1

我在我的框架中使用頁面對象模型。我已經定義了所有通過靜態方法返回的webelements。例如:處理缺少的Web元素 - 頁面對象模型

 @Test (priority=1) 
    public static void Verify_Login() 
// Verify Logging in with right credentials 
    {  
     driver.get("myurl"); 
     Login_Page.Textbox_UserName(driver).sendKeys 
     } 

,我面對的是挑戰:

public class Login_Page { 

private static WebElement element = null; 

public static WebElement Textbox_UserName (WebDriver driver) 
{ 

    element = driver.findElement(By.xpath(".//div[@class='username']")); 

    return element; 

} 

而且在我的測試我使用這個通過輸入用戶名 假設此元素的應用程序不存在,說的XPath已經改變了,當執行Textbox_UserName方法時,我在Login_Page類中得到了「沒有這樣的元素異常」。 因此,腳本甚至沒有來到我的測試案例Verify_login()方法,我實際上在我的報告中輸入失敗。

if (Login_Page.TextBox_UserName(driver).isVisible()==true) 
     { 
      //PASS 
     }else 
     { 
      //FAIL 
       } 

任何人都可以請建議我怎麼能趕上「沒有這樣的元素異常」從那裏,在從我的if/else條件執行我的報告中使用它? 我嘗試使用Try/Catch塊並返回異常,但由於返回類型是TextBox_Username()靜態方法中的webElement,所以我無法做到這一點。 任何幫助表示讚賞。提前致謝。

回答

0

您可以使用try-catch塊在你的代碼Verify_Login方法

@Test (priority=1) 
public static void Verify_Login() { 
// Verify Logging in with right credentials 
    try{ 
     //YOUR CODE 
    } 
    catch(NoSuchElementException nsee) { 
     System.out.println("You are getting No Such Element Exception");   
     //Perform What you want if exception happens 
    } 
    catch(Exception e) { 
     System.out.println("You are getting other Exception");   
     //Perform What you want if any other exception happens (Except NoSuchElementException) 
    } 
} 
+0

@ Ashish-這沒有奏效。 NOSuchElement異常不是來自Verify_Login方法。它來自PAge類中的靜態方法。所以這種方法不會工作:( – FreakTester

0

如果您使用嘗試捕捉,你可以返回null到你的方法是這樣的:

public static WebElement Textbox_UserName (WebDriver driver){ 
     WebElement element = null; 
     try { 
      element = driver.findElement(By.xpath(".//div[@class='username']")); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return element; 
} 

然後

if (Login_Page.TextBox_UserName(driver)!=null){ 
     //PASS 
}else{ 
     //FAIL 
} 

您應該使用WebDriverWait避免捕捉錯誤,而br owser正在加載。

public static WebElement Textbox_UserName (WebDriver driver){ 
    WebDriverWait wait = (new WebDriverWait(driver, 10);   
    WebElement element = null; 

    try { 
     wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(".//div[@class='username']")); 
     element = driver.findElement(By.xpath(".//div[@class='username']")); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return element; 
} 
+0

@ SDBot-謝謝,但問題不是沒有這樣的elementException。我無法得到該錯誤,並將其用於我的If/else塊Verify_login。 – FreakTester

+0

您嘗試過使用WebDriverWait嗎? – SDBot

+0

我創建了NoSuchElementException,以便我得到一個錯誤,我故意改變了xpath,以便我得到這個異常。所以這不是一個等待問題。我想要獲取在我的Verify_Login方法中捕獲類型異常時引發的錯誤。我可以登錄到我的報告。 – FreakTester

2

我使用頁面對象模型中的所有時間,但我做到這一點不同,因爲你正在運行到這個問題(和問題喜歡)的。我只在需要時抓住元素。因此,而不是抓取頁面上的所有元素,例如PageFactory之類的,我等到我要在單元之前點擊一個元素。

下面是一個示例頁面對象,顯示了我在說什麼。

如果某個元素不存在,當您嘗試點擊該元素時會出現錯誤。您將看到異常消息中不存在該元素,您可以調查該頁面並確定定位器需要更改的內容,然後轉到頁面頂部並更改定位器,重新構建並運行測試。問題解決了。 :)

package sandbox; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class PageObject 
{ 
    private WebDriver driver; 
    private By waitForLocator = By.id("someId"); // this is a locator for some element on the page that is last to load 

    private By buttonLocator = By.id("sampleId"); 
    private By usernameLocator = By.id("usernameId"); 
    private By productNameLocator = By.id("productId"); 

    public PageObject(WebDriver webDriver) 
    { 
     this.driver = webDriver; 

     // wait for page to finish loading 
     new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(waitForLocator)); 

     // see if we're on the right page 
     if (!driver.getCurrentUrl().contains("samplePage.jsp")) 
     { 
      throw new IllegalStateException("This is not the XXXX Sample page. Current URL: " + driver.getCurrentUrl()); 
     } 
    } 

    public void clickButton() 
    { 
     driver.findElement(buttonLocator).click(); 
    } 

    public String getProductName() 
    { 
     return driver.findElement(productNameLocator).getText(); 
    } 

    public void setUsername(String username) 
    { 
     driver.findElement(usernameLocator).sendKeys(username); 
    } 
}