java
  • selenium
  • 2014-06-11 142 views 0 likes 
    0

    我有幾個測試顯式等待硒測試。如何使靜態工廠方法不是靜態實例?

    我用得太多了。我想將它移動到基類和削減每次創建新的對象:

    新WebDriverWait(...)

    現在看起來未來

    public void logOutUser() { 
        new WebDriverWait(driver, 30).until(presenceOfElementLocated(By.xpath("//span[@class='gb_W gbii']"))); 
        userOptionsMenu.click(); 
        new WebDriverWait(driver, 30).until(presenceOfElementLocated(By.xpath("//div/a[@id='gb_71']"))); 
        signOutLink.click(); 
    } 
    

    我想將它移動到基類,並繞過多餘的對象創建。

    基類

    public class AndroidBasePage implements IPage { 
    
        protected WebDriver driver = null; 
    
        private WebDriverWait driverWait; 
    
        public AndroidBasePage() { 
         driver = SeleniumManager.activeBrowser(); 
        } 
    
        @Override 
        public WebDriver getDriver() { 
         return driver; 
        } 
    
        public WebDriverWait getWait() { 
         if (driverWait == null) { 
          driverWait = new WebDriverWait(driver, 30); 
         } 
         return driverWait; 
        } 
        protected void driverWaitPresenceOfElement(String xpath) { 
         getWait().until(presenceOfElementLocated(By.xpath(xpath))); 
        } 
    } 
    

    作品現在

    public void logOutUser() { 
        driverWaitPresenceOfElement("//span[@class='gb_W gbii']"); 
        userOptionsMenu.click(); 
        driverWaitPresenceOfElement("//div/a[@id='gb_71']"); 
        signOutLink.click(); 
    } 
    

    但我不知道它的效率。有什麼建議麼。

    是否存在某種方式使getWait()靜態?

    +0

    不,因爲它對於類的每個實例都不相同,所以您會爲每個AndroidBasePage實例返回不同的WebDriverWait。 – user3722371

    +0

    所有這些確實可以避免始終創建一個新的'WebDriverWait'實例,並不確定您從中獲得了什麼。 – Arran

    +0

    @Arran你知道其他替代方案嗎? –

    回答

    0

    我們在基於Selenium webdriver的項目(非Android)中做了類似的事情。使用抽象的超類。其中一個功能是getElement(String id/Xpath/name etc),這將隱含提供等待。

    您的情況我想知道您爲什麼需要工廠方法?而是讓它成爲你的對象實例化的一部分(等待需要你的確切驅動實例)。稍微修改你的班級:

    public class AndroidBasePage implements IPage { 
    
        protected WebDriver driver; 
    
        private WebDriverWait driverWait; 
    
        public AndroidBasePage() { 
         driver = SeleniumManager.activeBrowser(); 
         //only one driverwait for a page instance 
         driverWait = new WebDriverWait(driver, 30);//time should be configurable 
        } 
    
        @Override 
        public WebDriver getDriver() { 
         return driver; 
        } 
    
    
        protected void driverWaitPresenceOfElement(String xpath) { 
         driverWait.until(presenceOfElementLocated(By.xpath(xpath))); 
        } 
    } 
    
    0

    我看到你有30秒的固定等待時間。調用Web驅動程序初始化後使用隱式等待是否更好?

    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    
    +0

    我做了這個。但我也必須明確。 –

    相關問題