我正在使用我们现有的工具,它使用Selenium IWebdriver的Firefox和Chrome实现完美运行.
我现在正在使用PhantomJS实现进行一些实验.到现在为止还挺好.但是,只要我想点击一个按钮,它就什么都不做.
我可以检索元素,但是,仔细查看其属性,"Selected"属性指出以下内容:
Error Message => 'Element is not selectable' caused by Request => {"headers":{"Accept":"application/json, image/png","Connection":"Close","Host":"localhost:37704"},"httpVersion":"1.1","method":"GET","url":"/selected","urlParsed":{"anchor":"","query":"","file":"selected","directory":"/","path":"/selected","relative":"/selected","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/selected","queryKey":{},"chunks":["selected"]},"urlOriginal":"/session/fcaf88a0-40b4-11e3-960d-bdce3224aacf/element/%3Awdc%3A1383063211142/selected"}
Run Code Online (Sandbox Code Playgroud)
我会收集这是我的点击没有被执行的原因,但是,我不能从这个错误消息做出正面或反面.使用谷歌也没有帮助.
任何帮助将非常感激.
提前致谢.
我正在使用Selenium Webdriver(Java)和PhantomJS来测试复杂的JS驱动的网站.我的问题是,PhantomJS浏览器会在两次测试之间保持会话,从而导致测试设置出错.
如果我使用Firefox运行测试一切正常,因为Firefox为每个测试用例使用了一个干净的会话.
我解决问题的第一个尝试是通过JS注入清除本地存储.暴露的Selenium会删除CookieAPI driver.manage().deleteAllCookies();
但是不允许在不访问页面的情况下执行JavaScript.因此,在"about:blank"处启动浏览器会导致错误.
那么,如何配置我的phantomjs webdriver来清除会话?
我正在使用phantomjs和webdriver,因为硒网格服务结果不够稳定.所以我开始我的phantomjs实例:
phantomjs --webdriver=1234
Run Code Online (Sandbox Code Playgroud) 我正在寻找能力渲染pdf与PhantomJSvia GhostDriver,而不仅仅是渲染pdf.当我使用下一个代码,然后正常加载页面:
from selenium import webdriver
driver = webdriver.PhantomJS('./node_modules/phantomjs/bin/phantomjs')
driver.set_window_size(1024, 768)
driver.get('http://stackoverflow.com')
Run Code Online (Sandbox Code Playgroud)
当我通过命令行https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js使用下一个脚本时,pdf生成完美.
现在我想要执行脚本像rasterize.js(page.render('file.pdf'))但通过webdriver.webdriver有execute_script方法,但它看起来像PhantomJS代码评估,并且无权访问webpage实例上下文.也webdriver有get_screenshot_as_base64方法,但它只返回png.
我使用的最新版本selenium,phantomjs,nodejs.
所以我的问题是如何PhantomJS通过GhostDriver和评估render方法访问网页实例?
问题: GhostDriver API尚不支持警报处理.目前有一个可接受的解决方法,即将自己的javascript注入到处理警报并为您存储文本的页面中.
我通过python webdriver绑定使用此解决方法时遇到问题.这可能与我对新手级别的javascript理解有关.
以下是我尝试使用的解决方法示例:https: //github.com/detro/ghostdriver/issues/20#issuecomment-15641983
我正在使用一个显示警报的公共站点,以使其更简单:http://www.tizag.com/javascriptT/javascriptalert.php
这是我的代码:
from selenium import webdriver
button_xpath = "/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr/td/div[4]/form/input"
js = """
(function () {
var lastAlert = undefined;
window.alert = function (message) {
lastAlert = message;
};
window.getLastAlert = function () {
var result = lastAlert;
lastAlert = undefined;
return result;
};
}());
"""
driver = webdriver.PhantomJS()
driver.get('http://www.tizag.com/javascriptT/javascriptalert.php')
driver.execute_script("window.alert = %s" % js)
driver.find_element_by_xpath(button_xpath).click()
#exception just occured
driver.execute_script("return window.getLastAlert && window.getLastAlert();")
Run Code Online (Sandbox Code Playgroud)
例外是:
WebDriverException: Message: u'Error Message => …Run Code Online (Sandbox Code Playgroud) 我正在使用夜视仪并尝试迭代元素列表.但是,当我没有获得对象或元素时,我得到了一个字符串数组.
码
browser.elements("css selector", ele, function(r){
browser.perform(function(){
console.log("LIST", r);
})
})
Run Code Online (Sandbox Code Playgroud)
返回
LIST { sessionId: 'b273b874-c084-4d17-8bbe-a911a170ef25',
status: 0,
state: 'success',
value:
[ { ELEMENT: '6' },
{ ELEMENT: '7' },
{ ELEMENT: '8' },
{ ELEMENT: '9' },
{ ELEMENT: '10' },
{ ELEMENT: '11' } ],
class: 'org.openqa.selenium.remote.Response',
hCode: 995684858 }
Run Code Online (Sandbox Code Playgroud)
本value应该返回webElements权的对象?
提前致谢
我在PhantomJS 1.9.1和GhostDriver 1.0.4,JDK 1.7和Win 7 OS中运行基于Java的Selenium测试.
我也在使用BrowserMob代理,以便我可以捕获网络流量来验证一些网络呼叫.下面给出了我的代码的样子.
server = new ProxyServer(44444);
server.start();
final Proxy proxy = server.seleniumProxy();
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, proxy);
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capabilities.setCapability(CapabilityType.TAKES_SCREENSHOT, true);
capabilities.setCapability(CapabilityType.SUPPORTS_FINDING_BY_CSS, true);
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, new String[] { "--ignore-ssl-errors=yes" });
capabilities.setCapability("browserType", "phantomjs");
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, System.getenv("PHANTOMJS_EXECUTABLE_PATH_PROPERTY"));
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_PATH_PROPERTY, System.getenv("GHOST_DRIVER_HOME") + "\\main.js");
driver = new PhantomJSDriver(capabilities);
Run Code Online (Sandbox Code Playgroud)
然后我执行我的测试.有时测试没有任何错误,有时我会遇到2个不同的错误.我不确定是什么原因造成的.
如果你可以帮助我,或者给我一些关于这里可能出错的线索.如果需要,我可以提供更具体的信息.
[ERROR - 2013-07-30T14:05:46.693Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1375193146688
[ERROR - 2013-07-30T14:05:46.713Z] RouterReqHand - _handle - Thrown => {
"message": "Error Message => …Run Code Online (Sandbox Code Playgroud) 首先,这是一个跟进问题:更改正在运行的蜘蛛scrapyd的数量
我使用phantomjs和selenium为我的scrapy项目创建了一个下载器中间件.当我在本地一次运行一只蜘蛛时,它运作良好,并没有真正放慢速度.
但就在最近,我在AWS上放了一台scrapyd服务器.我注意到一个可能的竞争条件,当一次运行多个蜘蛛时,这似乎会导致错误和性能问题.我觉得问题源于两个不同的问题.
1)蜘蛛试图同时使用可执行的phantomjs.
2)蜘蛛试图同时登录phantomjs的ghostdriver日志文件.
在这里猜测,性能问题可能是蜘蛛试图等待资源可用(这可能是因为我也有一个sqlite数据库的竞争条件).
以下是我得到的错误:
exceptions.IOError:[Errno 13]权限被拒绝:'ghostdriver.log'(日志文件竞争条件?)
selenium.common.exceptions.WebDriverException:消息:'无法连接到GhostDriver'(可执行竞争条件?)
我的问题是:
我对问题的分析是否正确?
除了限制一次可以运行的蜘蛛数量之外,是否有任何已知的解决方案?
还有其他方法我应该处理JavaScript吗?(如果你认为我应该创建一个全新的问题来讨论使用scrapy处理javascript的最佳方法让我知道,我会)
这是我的下载中间件:
class JsDownload(object):
@check_spider_middleware
def process_request(self, request, spider):
if _platform == "linux" or _platform == "linux2":
driver = webdriver.PhantomJS(service_log_path='/var/log/scrapyd/ghost.log')
else:
driver = webdriver.PhantomJS(executable_path=settings.PHANTOM_JS_PATH)
driver.get(request.url)
return HtmlResponse(request.url, encoding='utf-8', body=driver.page_source.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
注意:_platform代码是一个临时工作,直到我将此源代码部署到静态环境中.
我找到了针对javascript问题的解决方案但是它们是基于蜘蛛的.这让我感到困扰,因为这意味着每个请求都必须在下载程序处理程序中再次执行,并再次在蜘蛛中.这就是为什么我决定将我的实现作为下载中间件.
我正在尝试使用PHP webdriver和PhantomJS更改输入的值.当我运行一个简单的
$driver->executeScript("document.getElementById('changeme').value='".$newvalue."' ;", array());
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
拒绝将字符串评估为JavaScript,因为unsafe-eval不是以下内容安全策略指令中允许的脚本源
我已经设置了以下命令行选项
--ignore-ssl-errors=true --web-security=false --ssl-protocol=any
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我是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 …Run Code Online (Sandbox Code Playgroud) 我正在做的事情:
首先,我的HTML看起来如下:
<form action="http://example.com/upload_photo_iframe.html" preview_div="upload_photo_div" submit_button="submit_btn" upload_field="photo_upload" target="photo_target" enctype="multipart/form-data" method="POST" id="uploadfile" name="uploadfile">
<input type="hidden" value="CSRF_iframe_photo_upload" name="csrfname">
<input type="hidden" value="3350427f0f068509081a09e283607214001b6912843ffb937b934208c91d9041c88faf0e66df4f3898ef202a34b669647f5b3fd9a2122e389acd3f53c33fc88b" name="csrftoken">
<label class="file-upload">
<p id="upload_text">Click Browse to choose a file then click Upload</p>
<input type="file" class="file" id="photo_upload" name="photo_upload" accept="image/*">
</label>
<input type="hidden" value="true" name="makeLargeThumb">
<input type="hidden" value="p" name="size">
<input type="hidden" value="P" name="type">
<input type="hidden" value="5120000" name="MAX_FILE_SIZE">
<input type="hidden" value="0" name="album_id" class="album_id_hidden">
<input type="submit" class="grey_btn" id="upload_btn" value="Upload" name="submit_btn">
<input type="hidden" name="callback" value="document.forms.uploadfile.handleReceive"><input type="hidden" name="fieldName" value="photo_upload"></form>
Run Code Online (Sandbox Code Playgroud)
我发布了整个文件,文件输入是以下部分:
<input type="file" class="file" id="photo_upload" name="photo_upload" accept="image/*"> …Run Code Online (Sandbox Code Playgroud) ghostdriver ×10
phantomjs ×8
selenium ×8
python ×3
webdriver ×2
.net ×1
c# ×1
java ×1
javascript ×1
junit ×1
php ×1
python-2.7 ×1
scrapy ×1
testing ×1