我昨天早上来到办公室,发现我的Capybara测试无法与Chrome互动.我正在看
Selenium::WebDriver::Error::UnknownError: unknown error: unable to discover open pages
Run Code Online (Sandbox Code Playgroud)
谷歌搜索显示,这可能是由于过时chromedriver
或selenium-webdriver
听起来非常合理,因为它们都没有在很长一段时间内更新(我认为chromedriver
是在2.2
和selenium-webdriver
之前2.35.1
),并且自从Chrome自动更新到32.0.1700.77
1月份14,这对我来说似乎是很好的证据.
所以我已经更新selenium-webdriver
到了2.39.0
.弄清楚chromedriver
我一直在使用的版本实际上变得更加困难.我有一个版本chromedriver
坐在我认为我的代码所指的我的下载目录中,但是我找不到我的下载目录PATH
(顺便说一下我使用的是OS X).我试着用版本替换该文件2.8
从这里,但它没有任何效果.我对下载目录中的版本是首先使用的版本持怀疑态度,所以我用brew来安装它.brew info chromedriver
现在收益率:
chromedriver: stable 2.8
http://code.google.com/p/chromedriver/
/usr/local/Cellar/chromedriver/2.8 (2 files, 21M) *
Built from source
From: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/chromedriver.rb
Run Code Online (Sandbox Code Playgroud)
看起来不错.我的PATH
包含/usr/local/bin
,其中包含chromedriver
安装到的位置brew 的链接.据我了解,这应该允许我的自动化检测和启动chromedriver
.
不幸的是,我的问题仍然没有得到解决.我留下来了unable to discover pages
.任何人都可以确认我已经做了通常做的设置chromedriver
吗?
问题:chromedriver …
我已经将应用程序从webpack-i18n
用于翻译升级为使用i18next
(13.1.5)。在大多数情况下,一切正常,但是在一个特定页面上,我的ejs
文件之一中的文本均未加载。在特定情况下,js
该页面的文件会进行一些调用i18next.t
,如果我触发了它们,则将成功检索并显示这些字符串的文本。该ejs
文件似乎仍在处理中,因为结构和图像都正确。
我找不到任何可以解释正在发生的错误,并且不确定i18next
在此页面上如何查找正在发生的情况。我有debug: true
for i18next
,可以在浏览器控制台中看到整个配置。这包括资源,以及翻译键/值对的完整列表。因此,似乎i18next
正在查找所有字符串并加载它们。但是在这个ejs
文件中对它们的任何引用都没有。
我们只有en
翻译,在i18next
配置中,lng
和fallbackLng
均为en
。因此,我认为该应用程序认为该模板文件可能不需要使用其他语言,并且正在寻找一种不存在的替代翻译。我想这也会以某种方式提示它出错。
控制台中没有错误。那么,我如何才能找到有关i18next
这种情况下正在发生的事情的更多信息?我无法确定它是否真的在ejs
文件中命中并评估了这些调用,并认为这null
是正确的响应,或者是否以某种方式根本不评估这些字符串中的任何一个,还是在实际中遇到了某种错误,并且错误只是没有达到我。
由于其他页面可以正常工作,甚至js
这个页面的文件中的字符串都可以正常工作,这更加令人困惑。在无法ejs
正常工作的文件和无法正常工作的文件之间,我找不到任何不同之处。一个或多个引用的字符串出现问题似乎不太可能导致文件中的所有字符串失败,尤其是如果它默默地失败了。有什么想法吗?我是i18next
Java的新手,对Java的了解也不是很好,所以我不知如何进一步调试。
我一直在研究一个已经开发了几个月的Selenium WebDriver基础架构的团队,而且我们从测试用例和页面对象访问驱动程序对象的方式让我很烦恼.
我们的测试用例创建一个新的WebDriver实例并打开浏览器.此新实例存储在测试用例类中.
然后,测试用例实例化页面对象.随着Selenium的页面对象模式,这些页面对象将WebDriver作为其构造函数中的参数(尽管我在我们的版本中注意到它不是最终的).各种页面对象方法使用在页面对象的构造函数中设置的驱动程序来执行它们的操作.如果页面对象方法导航到新的页面对象,则WebDriver将传递给它.就像Selenium的例子一样:
public class LoginPage {
private final WebDriver driver;
public LoginPage(WebDriver driver) {
this.driver = driver;
// Check that we're on the right page.
if (!"Login".equals(driver.getTitle())) {
// Alternatively, we could navigate to the login page, perhaps logging out first
throw new IllegalStateException("This is not the login page");
}
}
// Conceptually, the login page offers the user the service of being able to "log into"
// the application using a user name and password. …
Run Code Online (Sandbox Code Playgroud) 我比Ruby和Capybara以及SitePrism更熟悉Java和Selenium,所以如果这个问题比较厚,我会道歉.
Selenium有一个非常有用的类来管理Select标签,Selenium :: WebDriver :: Support :: Select,它可以通过传递代表select 的Selenium Element(Selenium :: WebDriver :: Element)来创建.我想得到一个Select对象,所以我可以使用它方便的方法.
然而,使用SitePrism和Capybara,定义元素的标准方法使我能够访问由Capybara的Element类,Capybara :: Node :: Element建模的选择,我似乎无法找到提取底层Selenium元素的简单方法来自Capybara元素.
我一直在寻找替代方案,并找到了Capybara的#select方法,但这对我来说似乎非常有限,因为它看起来像是强迫你按值选择并且在页面上定义选择的参数非常窄.
有没有一种简单的方法可以从SitePrism/Capybara创建Selenium Select?或者有更好的方法完全这样做吗?谢谢!
我正在帮助建立一个自动化框架来测试我们的网站.由于测试用例必须针对Chrome,Firefox和IE运行,因此我们目前正在为我们的驱动程序传递WebDriver对象.实际上,该对象可能是ChromeDriver,FirefoxDriver或InternetExplorerDriver,视情况而定.
我遇到的问题是我想让这个驱动程序打开一个新窗口以验证测试.我发现这样做的唯一方法是执行javascript - 请参阅此处.
为了执行javascript,驱动程序必须实现JavascriptExecutor接口.我们将使用的所有驱动程序实际上都是JavascriptExecutors,但由于我们使用的是WebDriver接口,因此无法保证.我试图让javascript运行,至少作为一个概念证明,但我也想知道如何正确组织我们的驱动程序对象,以便它可以执行javascript而无需明确说明它是三个驱动程序中的哪一个.
以下是我试图测试打开新窗口的javascript方法.那没起效:
if (ChromeDriver.class.isInstance(driver)) {
ChromeDriver chrome = (ChromeDriver)driver;
chrome.executeScript("window.open()");
}
for (String handle : driver.getWindowHandles()) {
System.out.println(handle);
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我使用Chrome进行测试,所以我知道驱动程序实际上是ChromeDriver.我猜测代码无法打开一个新窗口,因为我正在实例化一个新的驱动程序对象,我认为这不适用于Selenium.如果它有效,我会继续尝试识别窗口(使用driver.getWindowHandles)并在新窗口中加载URL.
那么 - 代码无法打开我正在创建/投射Selenium不喜欢的新驱动程序对象的新窗口的原因是什么?如果是这样,什么是正确的解决方案?我是否需要创建一个夹在Chrome,Firefox和IE驱动程序与JavascriptExecutor界面之间的新界面 - 这样的话?
public interface SpecialDriver extends WebDriver, JavascriptExecutor {
}
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用 - 至少,我无法将ChromeDriver分配给SpecialDriver,因为ChromeDriver没有显式实现我的新组合界面,即使它实现了WebDriver和JavascriptExecutor.我用这种方法完全吠叫错误的树吗?提前致谢.
selenium ×3
webdriver ×3
javascript ×2
capybara ×1
ejs ×1
i18next ×1
java ×1
ruby ×1
site-prism ×1
webpack ×1