5

के लिए एक समृद्ध टेक्स्ट एडिटर फ़ील्ड को भरने के लिए कैसे मैं संवेदना में अपने स्वीकृति परीक्षण के भीतर एक समृद्ध टेक्स्ट एडिटर फ़ील्ड (TinyMCE) भरने की कोशिश कर रहा हूं।एक स्वीकार्य स्वीकृति परीक्षण

fillField() फ़ंक्शन का उपयोग नहीं करता क्योंकि यह 'फ़ील्ड' वास्तव में एक इनपुट फ़ील्ड नहीं है। यह iframe है, जो फैंसी टेक्स्टरेरा की तरह दिखने के लिए स्टाइल है।

मैं कुछ पाठ को TinyMCE बॉक्स के शरीर में कैसे सेट कर सकता हूं? मुझे लगता है कि मैं $I->setContent(xpathOrCSS) फ़ंक्शन के अतिरिक्त की तलाश में हूं। या ऐसा करने के लिए कुछ और पहले से मौजूद है?

+0

आप अपने स्वीकृति परीक्षणों के लिए क्या उपयोग कर रहे हैं? चूंकि TinyMCE ज्यादातर जेएस संचालित है, PHPBrowser का उपयोग करने का विकल्प नहीं है, आपको वेबड्राइवर (अनुशंसित) या फैंटॉमजेएस (यदि आपको एक हेडलेस जेएस-सक्षम ब्राउज़र की आवश्यकता है) का उपयोग करने की आवश्यकता होगी –

उत्तर

1

सबसे अच्छा तरीका है:

$I->executeJS('$("#selector").val("Value")'); 
+1

बहुत सामान्य और अधूरा उत्तर – Alex

+2

आप निश्चित रूप से गलत हैं, आपको इस समस्या पर काम करने की ज़रूरत है। अपने आप से सोचो। कोई और मुद्दा अनावश्यक ओवरहेड जानकारी है। यह प्रश्नों के बारे में सब कुछ सिखाने के बारे में नहीं है, यह सिर्फ जवाब के बारे में है कि समस्या कहती है। –

+0

पूरी तरह से काम करता है: Yii2 + Redactor –

0

की कोशिश की और निम्नलिखित समाधान काम करता है:

$I->switchToIFrame('#frameName'); 
$I->executeJS('document.getElementById("tinymce").innerHTML = "<p>Test abc def</p>";'); 
3

यह (डिफ़ॉल्ट रूप से AcceptanceTester) सबसे अच्छा है अपने Actor वर्ग के लिए फिर से प्रयोग करने योग्य कार्यों जोड़कर ऐसा करते हैं करने के लिए। फिर आप अपने परीक्षणों की पठनीयता को कम किए बिना समृद्ध टेक्स्ट एडिटर फ़ील्ड की सामग्री सेट करने के लिए अपने परीक्षणों में कार्रवाइयों का उपयोग कर सकते हैं। इस पर अधिक जानकारी Codeception documentation में उपलब्ध है।

मैंने नीचे TinyMCE और CKEditor के लिए समाधान शामिल किए हैं। समाधान executeInSelenium() कॉल का उपयोग करता है ताकि हमें फेसबुक के अंतर्निहित WebDriver bindings तक पहुंच प्रदान की जा सके। वहां से, हम अपने लक्षित संपादक की सामग्री सेट करने के लिए here वर्णित फ़्रेम स्विचिंग/जावास्क्रिप्ट इंजेक्शन तकनीक का उपयोग करते हैं।

ध्यान दें कि $webDriver->switchTo()->defaultContent() पर अंतिम कॉल बहुत महत्वपूर्ण है - यह वेब ड्राइव्राइवर का आरटीई iframe से उस पृष्ठ पर वापस स्विच करता है जिसमें यह शामिल है।

अभिनेता कार्य:

<?php 

class AcceptanceTester extends \Codeception\Actor { 
    use _generated\AcceptanceTesterActions; 

    public function fillCkEditorById($element_id, $content) { 
     $this->fillRteEditor(
      \Facebook\WebDriver\WebDriverBy::cssSelector(
       '#cke_' . $element_id . ' .cke_wysiwyg_frame' 
      ), 
      $content 
     ); 
    } 

    public function fillCkEditorByName($element_name, $content) { 
     $this->fillRteEditor(
      \Facebook\WebDriver\WebDriverBy::cssSelector(
       'textarea[name="' . $element_name . '"] + .cke .cke_wysiwyg_frame' 
      ), 
      $content 
     ); 
    } 

    public function fillTinyMceEditorById($id, $content) { 
     $this->fillTinyMceEditor('id', $id, $content); 
    } 

    public function fillTinyMceEditorByName($name, $content) { 
     $this->fillTinyMceEditor('name', $name, $content); 
    } 

    private function fillTinyMceEditor($attribute, $value, $content) { 
     $this->fillRteEditor(
      \Facebook\WebDriver\WebDriverBy::xpath(
       '//textarea[@' . $attribute . '=\'' . $value . '\']/../div[contains(@class, \'mce-tinymce\')]//iframe' 
      ), 
      $content 
     ); 
    } 

    private function fillRteEditor($selector, $content) { 
     $this->executeInSelenium(
      function (\Facebook\WebDriver\Remote\RemoteWebDriver $webDriver) 
      use ($selector, $content) { 
       $webDriver->switchTo()->frame(
        $webDriver->findElement($selector) 
       ); 

       $webDriver->executeScript(
        'arguments[0].innerHTML = "' . addslashes($content) . '"', 
        [$webDriver->findElement(\Facebook\WebDriver\WebDriverBy::tagName('body'))] 
       ); 

       $webDriver->switchTo()->defaultContent(); 
      }); 
    } 
} 

उदाहरण उपयोग:

$content = '<h1>Hello, world!</h1>'; 

// CKEditor 
$I->fillCkEditorByName('rich_content', $content); 
$I->fillCkEditorById('my_ckeditor_textarea', $content); 

// TinyMCE 
$I->fillTinyMceEditorByName('rich_content', $content); 
$I->fillTinyMceEditorById('my_tinymce_textarea', $content); 

सभी मामलों में, पहले पैरामीटर मूल textarea तत्व की name/id विशेषता को दर्शाता है, और दूसरा पैरामीटर एचटीएमएल सामग्री को भरने के लिए है। यदि आप एक साधारण सेटअप है, तो

+0

ग्रेट उत्तर, यह मेरे दिन को बचाया और भविष्य में सभी सीकेडिटर परीक्षणों के लिए इसे बहुत पठनीय। धन्यवाद एलेक्स! –

0

इस

$x = $I->grabAttributeFrom('//iframe', 'id'); 
$I->switchToIframe($x); 
$I->fillField('//*[@id="tinymce"]', '<p>Test abc</p>'); 
1

कोशिश करते हैं और केवल tinyMCE 4 में एक उदाहरण का परीक्षण करने की जरूरत है, यह मेरे लिए काम किया।

$I->executeJS('tinyMCE.activeEditor.setContent(" your content goes here ");'); 
संबंधित मुद्दे