मुझे वास्तव में पसंद है कि सम्मेलन द्वारा सेलेनियम 2 आपको POOO के रूप में पेजऑब्जेक्ट्स का उपयोग करने के लिए प्रेरित करता है, और उसके बाद बस इस श्रेणी में फ़ील्ड को तुरंत चालू करने के लिए पेजफैक्टरी का उपयोग करता है।सेलेनियम पेज ऑब्जेक्ट रीयूज
मुझे जो सीमित है, वह यह है कि हम कई अलग-अलग पृष्ठों पर कई तत्वों का पुन: उपयोग करते हैं। बड़ी समस्या यह है कि इन पुन: उपयोग किए गए घटकों के पास अलग-अलग पृष्ठों पर दिखाई देने पर एक ही आईडी/नाम नहीं होता है; हालांकि हम उनमें से प्रत्येक के लिए परीक्षण करेंगे, वही है।
उदाहरण के तौर पर हम कई स्थानों पर तिथियां एकत्र करते हैं। तो इस के लिए एक उदाहरण पेज वस्तु हो सकता है (माह, दिन खेतों हटाया):
public class DatePageObject {
private WebDriver driver;
DatePageObject(WebDriver driver) {
this.driver = driver;
}
@FindBy(id = "someIdForThisInstance")
private WebElement year;
public void testYearNumeric() {
this.year.sendKeys('aa');
this.year.submit();
//Logic to determine Error message shows up
}
}
तो मैं बस इस नीचे दिए गए कोड के साथ परीक्षण कर सकते हैं:
public class Test {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
DatePageObject dpo = PageFactory.initElements(driver, DriverPageObject.class);
driver.get("Some URL");
dpo.testYearNumeric();
}
}
मैं वास्तव में क्या करना चाहते हैं क्या एक सेटअप है जिससे स्प्रिंग I के साथ उस आईडी/नाम/xpath, आदि ... इंजेक्शन में इंजेक्ट कर सकते हैं।
क्या कोई तरीका है कि मैं पेजफैक्टरी का उपयोग करने की क्षमता खोने के बिना ऐसा कर सकता हूं?
संपादित करें 1 - कस्टम लोकेटर और कारखानों पर काम कर रहे आदर्श आधार स्तर कक्षाएं जोड़ना।
public class PageElement {
private WebElement element;
private How how;
private String using;
PageElement(How how, String using) {
this.how = how;
this.using = using;
}
//Getters and Setters
}
public class PageWidget {
private List<PageElement> widgetElements;
}
public class Screen {
private List<PageWidget> fullPage;
private WebDriver driver;
public Screen(WebDriver driver) {
this.driver = driver;
for (PageWidget pw : fullPage) {
CustomPageFactory.initElements(driver, pw.class);
}
}
संपादित करें 2 - बस एक नोट के रूप में, जब तक आप सेलेनियम 2.0.a5 या अधिक से अधिक चल रहे हैं के रूप में, अब आप ड्राइवर एक अंतर्निहित टाइमआउट मान दे सकते हैं।
तो आप के साथ अपने कोड की जगह ले सकता:
private class CustomElementLocator implements ElementLocator {
private WebDriver driver;
private int timeOutInSeconds;
private final By by;
public CustomElementLocator(WebDriver driver, Field field,
int timeOutInSeconds) {
this.driver = driver;
this.timeOutInSeconds = timeOutInSeconds;
CustomAnnotations annotations = new CustomAnnotations(field);
this.by = annotations.buildBy();
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); //Set this value in a more realistic place
}
public WebElement findElement() {
return driver.findElement(by);
}
}
यह निश्चित रूप से उचित पटरी पर मुझे हो गया है। मैं बस आईडी के मुकाबले इसे आगे बढ़ाने की उम्मीद कर रहा था (आप किसी भी साधन को इंजेक्ट कर सकते हैं और फिर पता लगा सकते हैं)। मेरी समस्या यह थी कि मैं नहीं देख रहा था कि उन फ़ील्ड कैसे बनाए जा रहे थे - जो मुझे एलिमेंट लोकेटर के ठीक से समझने के लिए प्रेरित नहीं कर रहा था। – Scott