2010-07-17 7 views
14

कोड स्निपेट नीचे ठीक काम करता है, लेकिन मैं wait.until() लाइन के साथ एक छोटे से समस्या हो रही है:Wait.until() के साथ सेलेनियम 2 पेजफैक्टरी इनिट एलिमेंट्स का उपयोग कैसे करें?

wait.until(new ElementPresent(By.xpath("//a[@title='Go to Google Home']"))); 

यह काम करता है लेकिन मैं अपने PageFactoryWebElementhomePageLink बजाय भेजना चाहते हैं:

wait.until(new ElementPresent(homePageLink)); 

है ऐसा करने का कोई तरीका है?

इन नए फंसे हुए सेलेनियम 2 सुविधाओं को मेरे सिर को एक स्पिन में मिला है और मुझे अधिक दस्तावेज नहीं मिल रहा है।

धन्यवाद।

public class GoogleResultsPage extends TestBase { 

    @FindBy(xpath = "//a[@title='Go to Google Home']") 
    @CacheLookup 
    private WebElement homePageLink; 

    public GoogleResultsPage() { 
     wait.until(new ElementPresent(By.xpath("//a[@title='Go to Google Home']"))); 
     assertThat(driver.getTitle(), containsString("Google Search")); 
    } 
} 

public class ElementPresent implements ExpectedCondition<WebElement> { 

    private final By locator; 

    public ElementPresent(By locator) { 
     this.locator = locator; 
    } 

    public WebElement apply(WebDriver driver) { 
     return driver.findElement(locator); 
    } 
} 
+0

मैं SlowLoadableComponent बजाय का उपयोग करें। यह मुझे isLoaded() और load() के बीच में देरी करने देता है ताकि पेज लोड होने तक पृष्ठ फिर से प्रयास कर रहा हो। – djangofan

उत्तर

19

मैं AjaxElementLocatorFactory साथ PageFactory का उपयोग करें - PageFactory सेलेनियम पृष्ठ 2 के लिए एक समर्थन वर्ग है पैटर्न जो आप उपयोग कर रहे ऑब्जेक्ट्स, और AjaxElementLocatorFactory तत्व लोकेटर के लिए कारखाना है।

public GoogleResultsPage() { 
    PageFactory.initElements(new AjaxElementLocatorFactory(driver, 15), this); 
} 

इस कोड को 15 सेकंड की अधिकतम इंतजार करेंगे जब तक तत्वों एनोटेशन द्वारा निर्दिष्ट अपने मामले homePageLink जो xpath से स्थित हो जाएगा में, पृष्ठ पर दिखाई देगा: आपके मामले में निर्माता इच्छा की तरह दिखता है। आपको ElementPresent क्लास का उपयोग करने की आवश्यकता नहीं होगी।

+1

यह काम करता है लेकिन SlowLoadableComponent होगा। तो, सवाल यह है कि कौन सी विधि बेहतर काम करती है और किस स्थितियों के लिए? – djangofan

+0

भले ही यह थोड़ी देर हो, क्या आप मेरे लिए कुछ स्पष्टीकरण दे सकते हैं? सेलेनियम एपीआई थोड़ा बदल गया होगा, लेकिन अब AjaxElementLocatorFactory के बजाय 3 पैरामीटर हैं 2. क्या आप दूसरा पैरामीटर क्या हो सकता है पर हाथ दे सकते हैं? –

+0

क्या सी # में ऐसा करने का कोई तरीका है? मुझे AjaxElementLocatorFactory नहीं मिल रहा है। – chill182

1

AjaxElementLocatorFactory आंतरिक रूप से SlowLoadableComponent का उपयोग करता है। स्रोत कोड here

2

सी # पर कार्यान्वयन के लिए अनुरोध था।

संदेश यह है:

IWebDriver driver = new ChromeDriver(); 
RetryingElementLocator retry = new RetryingElementLocator(driver, TimeSpan.FromSeconds(5)); 
IPageObjectMemberDecorator decor = new DefaultPageObjectMemberDecorator(); 
PageFactory.InitElements(retry.SearchContext, this, decor); 
संबंधित मुद्दे