2015-09-15 51 views
4

明顯的問題是,當我嘗試將值設置爲輸入,硒返回以下錯誤創建: RuntimeError:元素是不可見的,所以可能無法進行交互元素與XSLT模板不受硒

無論如何,輸入完全可見。在這個測試中,我使用的是Firefox,因爲是正確加載應用程序的瀏覽器。

我無法更改應用程序代碼,應用程序有很多遺留代碼,但我重新創建了可以看到問題的最簡單示例。

您是否知道任何解決方法而無需修改應用程序代碼?

我使用webdriverio:

this.browser 
    .url('http://localhost/main.xml') 
    .setValue('[name=inputId]', 'aaaaaaaa') 
    .close() 
    .then(callback) 

的main.xml內容:

<?xml version="1.0" encoding="iso-8859-1" ?> 
<?xml-stylesheet type="text/xsl" href="main.xsl" ?> 
<CONTEXTO></CONTEXTO> 

main.xsl內容:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="iso-8859-1"/> 

    <xsl:include href="helper.xsl"/> 

    <xsl:template match="CONTEXTO"> 
     <html> 
      <head> 
       <title>Test main</title> 
       <style> 
        * { margin:0; } 
        form { position: absolute; } 
        input { border: 1px black solid; } 
       </style> 
      </head> 
      <body> 
       <form name="" action="" method="POST"> 
        <label for="inputId">inputId 
         <input type="text" name="inputId" id="inputId" value="" /> 
        </label> 
       </form> 
      </body> 
     </html> 

    </xsl:template> 
</xsl:stylesheet> 

helper.xsl內容:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <script></script> 
     <xsl:apply-templates select="CONTEXTO"/> 
    </xsl:template> 
</xsl:stylesheet> 

回答

0

也許您在使用XML內容時遇到了Selenium的限制,因爲瀏覽器對待HTML內容的方式不同。您可以嘗試使用SendKeys來解決此問題。但是,如果找不到元素,則必須通過鍵盤導航才能找到元素,這可能非常棘手。

或者,嘗試使用find_element_by_name or find_element_by_id or use XPaththis webdriver.io alternative查找元素。如果沒有任何工作,您可以通過遍歷從根節點到下一個樹的樹來找到。如果沒有任何工作,那麼我的猜測是,Selenium會看到XML DOM(嘗試查找根元素),而不是XSLT生成的DOM。

+0

感謝@Abel:您還可以通過執行以下代碼在Firefox的調試窗口重現XSL問題。我可以找到使用硒的元素,但不能識別爲可見。使用webdriver.io的selectorExecute方法它返回這個錯誤:RuntimeError:等待doc.body失敗。我在Selenium Developers小組發現了一個[關於這個問題](https://groups.google.com/forum/#!msg/selenium-developer-activity/OCCabUAE4Vw/VN7NyREIHk8J),它似乎是Firefox中的一個bug當xml文檔格式不正確時,在瀏覽器中執行js。 – atena

+0

@atena,如果XML文檔格式不正確,那麼XSLT甚至無法正常運行。如果您在沒有Selenium的情況下加載文檔,它是否正確渲染?如果檢查源代碼,您將看到呈現的XML,是否格式正確並且有效(可能是處理器啓動,並在發現非法內容時中斷,這是XSLT允許且符合標準的方法) – Abel

+0

是的@阿貝爾,應用程序是舊的內部網的一部分,它只是在一些Firefox和IE版本。我認爲問題是html標籤之前包含的腳本標籤,但這是我無法改變的。 – atena

0

試圖等待輸入值到第一存在:

.waitForExist('[name=inputId]', 1000) 
.setValue('[name=inputId]', 'aaaaaaaa') 
+0

謝謝jrader。投入存在,但硒繼續不可見。 – atena

+0

即使在使用waitForExist後,您也會收到錯誤消息?你回來什麼錯誤? – jrader

+0

@atena,我的猜測是,你遇到了Selenium的bug或者webdriver-io的bug。你應該報告它。但我懷疑他們對此做了太多的工作,這種類型的渲染(帶有xsl-stylesheet PI的XML文件)在實際生產環境中很少使用(您在我的答案下刪除了您的評論,所以我在此處轉貼) – Abel

0

的問題是,所述XSL正在產生不良HTML。助手是要匹配/並生成一個腳本標籤和應用CONTEXTO模板,導致文件如:

<script></script> 
<html>....</html> 

這並沒有太多意義,因爲HTML。

由於某種原因,firefox的TransformiIX引擎在這種情況下忽略了輸出方法HTML並回落到text輸出,這導致包含一個名爲transformiix:result的包裝標籤。 (請參閱此link以供參考)。

通過向webdriver發佈getPageSource()並將其打印到日誌,您可以像我一樣檢查它。你會看到結果的轉化輸出爲:

<transformiix:result> 
    <script></script> 
    <html>....</html> 
</transformiix:result> 

本公司製造的webdriver是完全無法與網頁互動。

解決它的推薦方法是修復XSLT。如果這不是一個選項(非常大的影響),那麼您可以在頁面加載之後(或第一次與頁面進行交互嘗試之前)使用webdriver的executeScript執行以下腳本。

document.getRootNode().replaceChild(document.getElementsByTagName('html')[0], document.getElementsByTagName('transformiix:result')[0]) 

這將替換時本與html標籤的文件根節點transformiix:result

請注意,如果在您當前的開發中,您的helper.xsl包含更多內容,您可能還需要將這些標記移動到標題標記內,作爲上述腳本的一部分。


編輯:

//Execute in a firefox inspect console 
var p = new XSLTProcessor(); 

var toTransform = document.implementation.createDocument(null, "CONTEXTO"); 

var parser = new DOMParser(); 
var xmlString = `<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="iso-8859-1"/> 
    <xsl:template match="/"> 
     <script></script> 
     <xsl:apply-templates select="CONTEXTO"/> 
    </xsl:template> 
    <xsl:template match="CONTEXTO"> 
     <html> 
      <body> 
       Hello 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 
`; 

p.importStylesheet(parser.parseFromString(xmlString, "text/xml")); 

var doc = p.transformToDocument(toTransform); 
console.log(doc.getRootNode().children[0].outerHTML);