【发布时间】:2017-07-05 16:22:51
【问题描述】:
我正在编写一个自动脚本,用于填写网页中某人地址的详细信息。请注意,我没有创建此网页。因此,在填写地址时,可以选择插入国家/地区。我检查了这个元素,发现它有一个“
我的问题是我需要确保我输入的国家/地区必须出现在下拉列表中。现在有趣的是:我检查了元素,单击“控制台”并输入以下 JavaScript 方法:
ns.Fields.isFieldValid("FieldName")
仅当值我键入列表中的国家/地区名称时才返回 true,否则返回 false。但是,我尝试通过在 Selenium 中使用以下代码来执行此操作:
FirefoxDriver driver = new FirefoxDriver();
driver.get(URL);
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("ns.Fields.isFieldValid("FieldName");
这给了我一个参考错误,说“ns”没有定义。现在我明白上面的 JS 代码被认为是我编写的新脚本,这里 ns 没有定义,因此我收到了这个错误。
所以我的问题是如何使用网页中已经存在的 JS 来执行代码,因为代码可以在浏览器控制台中运行,但不能通过 selenium 运行。有没有办法让我在 Firefox 的控制台中运行上述代码并从中获取真假结果?
火狐:46.0.1
硒:3.4.0
【问题讨论】:
-
出于好奇,通常当我使用 Selenium 时,我根本不会执行脚本。我知道 Selenium 有一些方法可以等待或检查 DOM 元素的存在。例如,是否有可能知道您要查找的选项的类名?然后,您可以与页面/DOM 进行交互,而不是通过 Selenium 执行 JS 以查找您想要的选项。
-
不,我不认为这是可能的。你看,当我加载页面时,下拉框中绝对没有任何内容。我开始在文本框中输入的那一刻,选项开始填充。所以我不完全确定国家名称是否在类文件中。从我在那里看到的情况来看,我认为 JS 方法是从 JSON 文件资源中提取详细信息(我不再可用)并选择与我输入的字母匹配的国家。
-
啊,好的,我明白了。端到端测试应该从用户的角度来测试页面或站点,所以我认为正确的解决方案是使用 Selenium 在框中键入并让页面运行实际搜索。然后,您可以在填充后搜索列表本身。但至于是否存在该选项——这在技术上是一个测试数据的问题,你“应该能够”依赖于知道测试存在的日子。或者你嘲笑它。或者,您可以在页面上运行手动搜索以查看可用于测试的选项类型。
-
@RoboBear 是对的,您不应该依赖内部实现。也就是说,对象
ns在执行命令时尚未创建,或者ns包含在wrappedJSObject中。试试return window.wrappedJSObject.ns.Fields.isFieldValid('FieldName') -
您的最后一行无效。应该是
jse.executeScript("return ns.Fields.isFieldValid('FieldName')");。它需要有一个return,并且您已经嵌套了"s,这会导致问题。将内部双引号更改为单引号,这应该会运行......但不确定它是否真的有效。
标签: javascript java html selenium