Phantom JS驱动程序有时无法定位元素

时间:2015-02-27 15:53:43

标签: python selenium webdriver phantomjs ghostdriver

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

Ghostdriver日志:

[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

3 个答案:

答案 0 :(得分:3)

所以......看起来任何使用Selenium WebDriver Wait的元素实际上都在使用轮询方案。请记住,Selenium显式等待是您定义的代码,用于在继续执行代码之前等待某个条件发生。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到它成功返回。 (reference.)这意味着每500 mSecs,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)

中设置的

Reference here.

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

看看分裂https://splinter.readthedocs.org/en/latest/index.html 它适用于selenium并实现等待元素的逻辑。