6

我是 PhantomJS 的新手,我正在尝试使用 phantomjs 驱动程序运行我的硒测试(python),但它不会是 web 元素。

幽灵驱动程序日志:

[INFO  - 2015-02-27T15:24:40.236Z] GhostDriver - Main - running on port 52653
[INFO  - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.0.0 Safari/538.1","webSecurityEnabled":true}
[INFO  - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - page.customHeaders:  - {}
[INFO  - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.0.0","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.9 (Mavericks)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
[INFO  - 2015-02-27T15:24:41.075Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: bfd397f0-be94-11e4-ad03-b711254501c8
[ERROR - 2015-02-27T15:24:47.242Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1425050687190

  :262 in error

有趣的是,在我成功安装了 phantomjs 之后,我运行了我的登录测试,它顺利通过了。然后我运行了另一个测试,但由于上述相同的原因而失败。我尝试再次运行已通过的登录测试 - 但 phantomjs 驱动程序将不再找到这些元素。

知道是什么原因造成的吗?

顺便说一句,这些测试在 chrome 和 FF 上运行良好

4

3 回答 3

3

所以......看起来任何使用 Selenium WebDriver Wait 的元素实际上都在使用轮询方案。请记住,Selenium 显式等待是您定义的代码,用于等待特定条件发生,然后再继续执行代码。默认情况下,WebDriverWait 每 500 毫秒调用一次 ExpectedCondition,直到它成功返回。(参考。)也就是说每 500 毫秒,Selenium 测试等待条件。如果属实,请继续。如果还不是真的,请等待另一个轮询频率周期,然后再试一次。

从我的测试来看,我的信念是民意调查测试尚未准备好,所以称之为失败肯定会在我的 ghostdriver.log 中产生错误

[ERROR - 2016-08-14T08:50:12.896Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1471164612878

我正在研究一个抓取复杂单页 AJAX 网站的项目。因为该站点重用了常见的 div 元素,所以我必须进行大量调用(清除、粘贴值、单击、等待、转到页面上的不同表格、复制感兴趣的数据、重复......)才能获得我需要的数据。而且由于该网站有点慢,我通过以下方式应用等待元素:

driver.wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='special_content_id']//td[contains(.,'" + info.unitId + "')]")))

原来轮询频率是在类中设置的selenium.webdriver.support.wait.WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

参考这里。

我很好奇这种行为。当我的 poll_frequency 设置为 0.5 秒时,我收到了 98 个 WebElementLocator 错误。当我将其切换到 7.5 秒时driver.wait = WebDriverWait(driver, 60, 7.5),我只收到 36 个错误。更小的轮询时间会产生更多的错误。

我真正觉得奇怪的是,我不希望正常的轮询行为(Selenium)在任何地方设置日志错误(PhantomJS)。我真希望有一个不同的日志条目用于轮询,元素尚未准备好......

于 2016-08-14T21:53:49.367 回答
0

您的 selenium 测试可能会在加载之前尝试查找元素。在第一次尝试失败后,您应该一次又一次地尝试并继续,直到您找到元素或超时。

查看 splinter https://splinter.readthedocs.org/en/latest/index.html 它与 selenium 一起使用并实现等待元素的逻辑。

于 2015-02-27T16:50:36.190 回答
0

我注意到这些元素没有被 phantomJS 驱动程序使用 find_element 方法定位在测试用例中,这些元素可以通过使用 JavascriptExecutor 的 javascript 访问。使用 java 脚本来访问元素和对元素的操作。我希望这能解决你的问题。

于 2015-02-27T16:21:19.710 回答