2013-01-22 14 views
10

का उपयोग करके फ़ॉर्म सबमिट करने के बाद ब्राउज़र प्रतिक्रिया के लिए प्रतीक्षा करें, मेरे परीक्षण में sleep() का उपयोग करने के अलावा, मुझे आश्चर्य है कि अगर कोई स्पष्ट रूप से फ़ॉर्म फॉर्म जमा करने के लिए एक बेहतर रणनीति के बारे में जानता है (POST) मेरे दावे के साथ जारी है। फेसबुक से php-webdriver एक साथ phpunit का उपयोग करके, मेरा परीक्षण कैसा दिखता है, इसका एक बहुत ही संघनित संस्करण यहां दिया गया है)।php-webdriver: क्लिक()

function test_form_submission() 
{ 
    // setup 
    $web_driver = new WebDriver(); 
    $session = $web_driver->session(); 
    $session->open('http://example.com/login'); 

    // enter data 
    $session->element('css selector', 'input[name=email]')->value(array('value' => str_split('[email protected]'))); 
    $session->element('css selector', 'input[name=password]')->value(array('value' => str_split('testpassword'))); 

    // click button to submit form 
    $session->element('css selector', 'button[name=submit]')->click(); 

    // How do I wait here until the click() above submits the form 
    // so I can check that we correctly arrives at the destination below 
    // without resorting to sleep()? 

    // Confirm that login was successful because we landed on account page 
    $this->assertSame('http://example.com/account', $session->url()); 

    // teardown 
    $session->close(); 
} 
+1

तो, जब आप अब इस कोड को निष्पादित करते हैं, तो दूसरी पंक्ति में अंतिम यूआरएल (जोर) में http://example.com/account की बजाय http://example.com/login देता है? संभावित रूप से सेलेनियम सर्वर को तत्व की तलाश करने से पहले पेज लोड होने तक स्वयं से बाहर निकलना चाहिए। इसके अपवाद अतुल्यकालिक अनुरोध हैं, लेकिन आपका बहुत समकालिक दिखता है। आपको याद है, मैं सेलेनियम – qrazi

+0

ड्राइव करने के लिए PHPUnit_Selenium का उपयोग कर रहा हूं। असल में मैं उस पल में एक स्क्रीनशॉट भी ले सकता हूं, और देख सकता हूं कि मैं अभी भी example.com/login पर हूं, लेकिन अगर मैं 1 सेकंड के लिए सोता हूं, तो जोर देता है, और स्क्रीनशॉट दिखाता है कि पृष्ठ अब उदाहरण पर है। com/खाता। मैंने पढ़ा है कि PHPUnit_Selenium सेलेनियम 2 (उर्फ वेबड्राइवर) चलाने के लिए काफी नहीं था इसलिए मैं ऊपर के दृष्टिकोण के साथ गया। –

उत्तर

0

के बजाय click() यह clickAndWait() उपयोग करने के लिए, क्रम में जब तक अगले पृष्ठ लोड होने की प्रतीक्षा करने के लिए संभव होना चाहिए।

+0

मुझे यकीन नहीं है कि php-webdriver के साथ काम करता है। मुझे निम्न त्रुटि मिलती है: "अपवाद: clickAndWait मान्य वेबड्राइवर कमांड नहीं है।" –

1

आप किसी विशेष वेब तत्व की प्रतीक्षा करने के लिए Implicit Wait and Explicit Wait का उपयोग कर सकते हैं जब तक कि यह पृष्ठ में दिखाई देता है। प्रतीक्षा अवधि जिसे आप परिभाषित कर सकते हैं और यह एप्लिकेशन पर निर्भर करता है।

स्पष्ट प्रतीक्षा:

एक स्पष्ट इंतजार कोड आप एक निश्चित शर्त कोड में आगे बढ़ने से पहले होने की प्रतीक्षा करने के लिए परिभाषित है। यदि प्राप्त की गई स्थिति यह प्रतीक्षा को समाप्त कर देगी और आगे के चरणों को आगे बढ़ाएगी।

कोड:

WebDriverWait wait = new WebDriverWait(driver,30); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(strEdit))); 

या

WebElement myDynamicElement = (new WebDriverWait(driver, 30)) 
.until(new ExpectedCondition<WebElement>(){ 
@Override 
public WebElement apply(WebDriver d) { 
    return d.findElement(By.id("myDynamicElement")); 
}}); 

यह एक TimeoutException फेंकने से पहले 30 सेकंड तक इंतजार कर रहा है या अगर यह पाता है तत्व 0 में वापस आ जाएगी - 30 सेकंड। डिफ़ॉल्ट रूप से WebDriverWait प्रत्येक 500 मिलीसेकंड की अपेक्षित कंडिशन को सफलतापूर्वक लौटाए जाने तक कॉल करता है। एक सफल वापसी अपेक्षित कैंडीशन प्रकार के लिए है, बूलियन वापस अन्य सभी अपेक्षित कंडिशन प्रकारों के लिए सही वापसी मूल्य नहीं है।

आप अपेक्षित कैंडिशन क्लास का उपयोग कर सकते हैं क्योंकि आपको एप्लिकेशन की आवश्यकता है।

अंतर्निहित प्रतीक्षा:

एक अंतर्निहित इंतजार WebDriver बताने के लिए जब एक तत्व या तत्वों को खोजने के लिए है, तो वे तुरंत उपलब्ध नहीं हैं की कोशिश कर समय की एक निश्चित राशि के लिए डोम मतदान पर है

कोड: ध्यान में रखने की

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

एक बात है कि एक बार निहित इंतजार सेट कर दिया जाता है - यह WebDriver वस्तु उदाहरण के जीवन के लिए ही रहेगा

अधिक जानकारी के लिए इस लिंक http://seleniumhq.org/docs/04_webdriver_advanced.jsp

+6

मैं विशेष रूप से एक PHP समाधान मांग रहा था जो php-webdriver का उपयोग करता है। –

2

ठीक है का उपयोग करें, तो मैं जानता हूँ कि यह एक बहुत पुरानी सवाल है, लेकिन जैसा कि मैं गूगल के माध्यम से इस पर ठोकर खाई मुझे आशा है कि यह अभी भी किसी को (शायद भी ओ पी के लिए उपयोगी हो सकता है? :-))।

Google कोड पर कुछ खोज और लेख पढ़ने और पढ़ने के बाद, मुझे एक समाधान मिला जो मुझे लगता है कि काफी बदसूरत है, लेकिन वास्तव में कोई अच्छा विकल्प नहीं है। आप here पढ़ सकते हैं कि पृष्ठ लोड होने पर वेबड्राइवर का पता लगाना असंभव है। तो, हमें प्रतीक्षा करने के लिए वापस जाना है। अब, ओपी फेसबुक के PHP वेबड्राइवर का उपयोग कर रहा है, जिसमें प्रतीक्षा यूटिलिटीज AFAIK शामिल नहीं है, लेकिन this maintained clone का उपयोग करते समय, आपको WebDriverWait का कार्यान्वयन मिलता है।

अब सवाल यह है कि हम किसके लिए प्रतीक्षा करते हैं? आप यूआरएल को बदलने के लिए इंतजार कर सकते हैं, लेकिन यह किसी भी तरह से विश्वसनीय दृष्टिकोण नहीं है क्योंकि पेज शायद तब तक लोड नहीं हुआ है जब यूआरएल पहले ही बदल चुका है। अगला विकल्प: उस तत्व के लिए प्रतीक्षा करें जिसे आप जानते हैं पृष्ठ पर दिखने के लिए लोड किया जाना है। यह काम करेगा, लेकिन क्या होगा यदि आप अधिक सामान्य दृष्टिकोण चाहते हैं? सौभाग्य से, मैंने ऊपर वर्णित in the thread का एक बहुत अच्छा विचार पढ़ा। आप गायब होने के लिए दोनों पृष्ठों पर मौजूद तत्व के लिए प्रतीक्षा कर सकते हैं और फिर से दिखाई दे सकते हैं, उदाहरण के लिए पाद लेख।

मैंने अभी इसे कार्यान्वित किया और ऐसा लगता है कि यह काम करता है। फ़ंक्शन के नीचे आपका $session पारित किया जा सकता है और जब नया पृष्ठ लोड होता है तो केवल तभी वापस आ जाएगा (या कम से कम, पाद लेख फिर से उपलब्ध है)।

public static function waitForNextPage($pWDSession) { 
    $aWait = new PHPWebDriver_WebDriverWait($pWDSession); 
    // wait for footer to not be available anymore 
    $aWait->until(
      function($pWDSession) { 
       return (0 === count($pWDSession->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "#footer,#mx-footer"))); 
      } 
     ); 
    // wait for footer to be available again 
    $aWait->until(
      function($pWDSession) { 
       return (0 < count($pWDSession->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "#footer,#mx-footer"))); 
      } 
     ); 
} 

आप स्पष्ट रूप से चयनकर्ता को बदल सकते हैं या किसी अन्य तत्व का उपयोग कर सकते हैं, यह विचार वही रहता है।

मुझे आशा है कि इससे मदद मिलती है! चीयर्स!

19

फेसबुक से php-webdriver जून 2013 में फिर से लिखा गया है। आप आसानी से यूआरएल की प्रतीक्षा कर सकते हैं।

// wait for at most 10 seconds until the URL is 'http://example.com/account'. 
// check again 500ms after the previous attempt. 
$driver->wait(10, 500)->until(function ($driver) { 
    return $driver->getCurrentURL() === 'http://example.com/account'; 
}) 
+0

क्या होगा अगर यूआरएल गतिशील रूप से बनाया गया हो? उदाहरण के लिए: site.com/item?id=123&color=black&size=small – Purefan

+1

नियमित अभिव्यक्ति द्वारा यूआरएल से मेल करें। – whhone

+0

कम से कम प्रतीक्षा सामान के लिए एक अच्छा जवाब! –