Behat

2014-07-24 5 views
5

में फ़ाइल डाउनलोड का परीक्षण कैसे करें इस एप्लिकेशन पर इस नई निर्यात कार्यक्षमता विकसित की गई है और मैं बीट/मिंक का उपयोग करके इसका परीक्षण करने की कोशिश कर रहा हूं। यहां समस्या यह है कि जब मैं निर्यात लिंक पर क्लिक करता हूं, पृष्ठ पर डेटा को CSV में निर्यात किया जाता है और/डाउनलोड के तहत सहेजा जाता है लेकिन मुझे पृष्ठ पर कोई प्रतिक्रिया कोड या कुछ भी दिखाई नहीं देता है।Behat

क्या कोई तरीका है कि मैं CSV निर्यात कर सकता हूं और फ़ाइल को सत्यापित करने के लिए/डाउनलोड फ़ोल्डर पर नेविगेट कर सकता हूं?

+1

डाउनवोट के लिए कोई औचित्य ?? यह एक पूर्ण मजाक नहीं है .. वास्तव में .. –

उत्तर

2

मान लें कि आप सेलेनियम ड्राइवर का उपयोग कर रहे हैं, तो आप लिंक पर "क्लिक करें" और $this->getSession()->wait(30) डाउनलोड समाप्त होने तक फ़ाइल के लिए डाउनलोड फ़ोल्डर को चेक कर सकते हैं।

यह सबसे आसान समाधान होगा। वैकल्पिक रूप से आप सभी अनुरोधों को देखने के लिए BrowserMob जैसे प्रॉक्सी का उपयोग कर सकते हैं और फिर प्रतिक्रिया कोड सत्यापित कर सकते हैं। लेकिन वह अकेले के लिए वास्तव में एक दर्दनाक रास्ता होगा।

फ़ाइल डाउनलोड होने की जांच करने का सबसे आसान तरीका मूल दावे के साथ एक और कदम परिभाषित करना होगा।

/** 
* @Then /^the file ".+" should be downloaded$/ 
*/ 
public function assertFileDownloaded($filename) 
{ 
    if (!file_exists('/download/dir/' . $filename)) { 
     throw new Exception(); 
    } 
} 

यह स्थिति में समस्याग्रस्त हो सकता है जब आप एक ही नाम वाली फ़ाइल डाउनलोड करते हैं और ब्राउज़र इसे एक अलग नाम के नीचे सहेजता है। एक समाधान के रूप में आप जानकारियों की सूची को साफ़ करने के लिए @BeforeScenario हुक जोड़ सकते हैं।

एक और मुद्दा डाउनलोड डीआईआर होगा - यह अन्य उपयोगकर्ताओं/मशीनों के लिए अलग हो सकता है। इसे ठीक करने के लिए आप अपने behat.yml में डाउनलोड निर्माता को संदर्भ कन्स्ट्रक्टर के तर्क के रूप में पास कर सकते हैं, इसके लिए docs पढ़ें।

लेकिन सबसे अच्छा तरीका सेलेनियम को डाउनलोड डीआईआर निर्दिष्ट करने के लिए कॉन्फ़िगरेशन पास करना होगा ताकि यह सुनिश्चित किया जा सके कि यह हमेशा स्पष्ट है और आपको पता है कि कहां खोजना है। मुझे यकीन नहीं है कि यह कैसे करें, लेकिन quick googling से ऐसा लगता है।

+0

हाय इयान, आप डाउनलोड फ़ोल्डर को कैसे देखते हैं। मैं हेडलेस ब्राउज़र (phantomJS) –

+0

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

2

चेकआउट इस ब्लॉग: https://www.jverdeyen.be/php/behat-file-downloads/

मूल विचार वर्तमान सत्र कॉपी और Guzzle साथ अनुरोध करना है। इसके बाद आप अपनी पसंद के किसी भी तरह की प्रतिक्रिया देख सकते हैं। सभी कुकी उपयोग करने के साथ

class FeatureContext extends \Behat\Behat\Context\BehatContext { 

    /** 
    * @When /^I try to download "([^"]*)"$/ 
    */ 
    public function iTryToDownload($url) 
    { 
     $cookies = $this->getSession()->getDriver()->getWebDriverSession()->getCookie('PHPSESSID'); 
     $cookie = new \Guzzle\Plugin\Cookie\Cookie(); 
     $cookie->setName($cookies[0]['name']); 
     $cookie->setValue($cookies[0]['value']); 
     $cookie->setDomain($cookies[0]['domain']); 

     $jar = new \Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar(); 
     $jar->add($cookie); 

     $client = new \Guzzle\Http\Client($this->getSession()->getCurrentUrl()); 
     $client->addSubscriber(new \Guzzle\Plugin\Cookie\CookiePlugin($jar)); 

     $request = $client->get($url); 
     $this->response = $request->send(); 
    } 

    /** 
    * @Then /^I should see response status code "([^"]*)"$/ 
    */ 
    public function iShouldSeeResponseStatusCode($statusCode) 
    { 
     $responseStatusCode = $this->response->getStatusCode(); 

     if (!$responseStatusCode == intval($statusCode)) { 
      throw new \Exception(sprintf("Did not see response status code %s, but %s.", $statusCode, $responseStatusCode)); 
     } 
    } 

    /** 
    * @Then /^I should see in the header "([^"]*)":"([^"]*)"$/ 
    */ 
    public function iShouldSeeInTheHeader($header, $value) 
    { 
     $headers = $this->response->getHeaders(); 
     if ($headers->get($header) != $value) { 
      throw new \Exception(sprintf("Did not see %s with value %s.", $header, $value)); 
     } 
    } 
} 
+0

आपकी प्रतिक्रिया tscheepers के लिए बहुत बहुत धन्यवाद। मैं जल्द ही कोशिश करूंगा। –

+1

आप किस ड्राइवर का उपयोग कर रहे हैं? मुझे यह कहीं याद है कि स्थिति कोड PhanomJS ड्राइवर का उपयोग कर समर्थित नहीं हैं। –

0

लिटिल संशोधित iTryToDownload() फ़ंक्शन: और वेब चालकों और ब्राउज़रों के साथ एक दूसरे सेलेनियम हब के साथ:

public function iTryToDownload($link) { 
$elt = $this->getSession()->getPage()->findLink($link); 
if($elt) { 
    $value = $elt->getAttribute('href'); 
    $driver = $this->getSession()->getDriver(); 
    if ($driver instanceof \Behat\Mink\Driver\Selenium2Driver) { 
    $ds = $driver->getWebDriverSession(); 
    $cookies = $ds->getAllCookies(); 
    } else { 
    throw new \InvalidArgumentException('Not Selenium2Driver'); 
    } 

    $jar = new \Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar(); 
    for ($i = 0; $i < count($cookies); $i++) { 
    $cookie = new \Guzzle\Plugin\Cookie\Cookie(); 
    $cookie->setName($cookies[$i]['name']); 
    $cookie->setValue($cookies[$i]['value']); 
    $cookie->setDomain($cookies[$i]['domain']); 
    $jar->add($cookie); 
    } 
    $client = new \Guzzle\Http\Client($this->getSession()->getCurrentUrl()); 
    $client->addSubscriber(new \Guzzle\Plugin\Cookie\CookiePlugin($jar)); 

    $request = $client->get($value); 
    $this->response = $request->send(); 
} else { 
    throw new \InvalidArgumentException(sprintf('Could not evaluate: "%s"', $link)); 
} 
} 
0

परियोजना में हम इस समस्या को हम दो सर्वर है कि है। नतीजतन हम हेडर लाने के लिए कर्ल अनुरोध का उपयोग करने का निर्णय लेते हैं। तो मैंने फ़ंक्शन लिखा जो चरण परिभाषा में बुलाया जाएगा। नीचे आप एक समारोह जो एक मानक php कार्यों का उपयोग पा सकते हैं: curl_init()

/** 
* @param $request_url 
* @param $userToken 
* @return bool 
* @throws Exception 
*/ 
private function makeCurlRequestForDownloadCSV($request_url, $userToken) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $request_url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    $headers = [ 
     'Content-Type: application/json', 
     "Authorization: Bearer {$userToken}" 
    ]; 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

    $output = curl_exec($ch); 
    $info = curl_getinfo($ch); 
    $output .= "\n" . curl_error($ch); 
    curl_close($ch); 

    if ($output === false || $info['http_code'] != 200 || $info['content_type'] != "text/csv; charset=UTF-8") { 
     $output = "No cURL data returned for $request_url [" . $info['http_code'] . "]"; 
     throw new Exception($output); 
    } else { 
     return true; 
    } 
} 

तुम कैसे मैं टोकन द्वारा प्राधिकरण है देख सकते हैं। यदि आप समझना चाहते हैं कि आपको किस हेडर का उपयोग करना चाहिए, तो आपको फ़ाइल मैनुअल डाउनलोड करना चाहिए और ब्राउज़र के टैब में अनुरोध और प्रतिक्रिया देखना चाहिए network

संबंधित मुद्दे