4

问题是,当我尝试为输入设置值时,selenium 返回以下错误: RuntimeError: Element is not current visible and so may not be interacted with

但是,输入是完全可见的。在这个测试中,我使用的是 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>
4

3 回答 3

0

尝试等待输入值首先存在:

.waitForExist('[name=inputId]', 1000)
.setValue('[name=inputId]', 'aaaaaaaa')
于 2015-09-15T23:20:30.860 回答
0

也许您在使用 XML 内容时遇到了 Selenium 的限制,因为浏览器对它的处理方式与 HTML 内容不同。您可以尝试改用 SendKeys 来解决此问题。但是,如果它找不到元素,您将不得不通过键导航找到该元素,这可能会很棘手。

find_element_by_name或者,尝试使用或find_element_by_id或使用 XPath此 webdriver.io 替代项来查找元素。如果没有工作,您可以通过从根节点到下一个节点遍历树来查找。如果没有工作,那么我的猜测是,Selenium 看到的是 XML DOM(尝试找到根元素),而不是 XSLT 生成的 DOM。

于 2015-09-15T16:50:06.417 回答
0

问题是 XSL 正在生成格式错误的 HTML。助手将匹配/并生成脚本标签并应用CONTEXTO模板,从而生成如下文档:

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

与 HTML 相比,这没有太多意义。

由于某种原因,firefox 的 TransformiIX 引擎在这种情况下忽略了输出方法HTML并回退到text输出,这导致包含一个名为transformiix:result. (请参阅此链接以供参考)。

您可以像我一样通过向 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])

transformiix:result这将替换带有html标签的文档根节点。

请注意,如果在您当前的开发中,您的 helper.xsl 包含更多内容,您可能还需要获取这些标签,然后将其移动到标题标签中,作为上述脚本的一部分。


编辑:您还可以通过在 firefox 调试窗口中执行以下代码来重现 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);
于 2018-01-15T08:59:11.767 回答