2017-07-17 51 views
0

我已經按照我的自定義步驟定義代碼(基於this):如何正確評估從Behat到Selenium的JavaScript代碼?

$js = <<<JS 

    function checkVisibility(elm, evalType) { 
     evalType = evalType || "visible"; 

     var vpH = jQuery(window).height(), // Viewport Height 
      st = jQuery(window).scrollTop(), // Scroll Top 
      y = jQuery(elm).offset().top, 
      elementHeight = jQuery(elm).height(); 

     if (evalType === "visible") return ((y < (vpH + st)) && (y > (st - elementHeight))); 
     if (evalType === "above") return ((y < (vpH + st))); 
    } 

    var el = document.querySelector("$locator"); 
    return checkVisibility(el, "visible"); 
JS; 


    $result = $this->getSession()->evaluateScript($js); 

類似的代碼在Chrome控制檯運作良好,但在貝哈特方面$result總是空。

我使用Behat:3.0.15與Selenium 3.4和PhantomJS作爲瀏覽器。

一般來說,如果我傳遞一行代碼,它似乎工作正常。不管是什麼我的函數裏,我一直爲空,所以下面的代碼也與空的結果:

$js = <<<JS 

    function checkVisibility() { 
     return true; 
    } 

    // var el = document.querySelector("$locator"); 
    return checkVisibility(); 
JS; 
+0

爲什麼只是沒有使用'isVisible'方法?你有沒有嘗試過,不工作? – lauda

回答

1

我有類似波紋管的作品:

$js = <<<JS 

    (function myFunction() { 
     //function content 
    })() 
JS; 

你應該等待元素以確保元素可見。

也得到你應該有類似的迴應:

$result = $this->getSession()->evaluateScript("return $js"); 
+0

當你把'return true'放到'myFunction()'時,你也會在PHP上得到'true' – drupality

+0

是的,我也在PHP中獲得'true'。我正在使用頁面對象,並且在頁面對象中有'$ this-> getDriver() - > evaluateScript(「return $ function」);''。 – lauda

+0

因此,我的環境出了問題。在我的例子中,'$ result'總是'null':/您是否使用phantomjs作爲瀏覽器? – drupality