我在内存中有一个html文件作为字符串.它包含一个<script>标记,其中包含一个操作dom的小脚本.我现在想要将该html页面加载到selenium webdriver中,并在脚本操作后返回页面.由于我已经在内存中使用了html,因此我不喜欢将html写入文件并将其作为文件加载的想法driver.get("file://path/to/file").所以问题是,如果有可能实现我想要的.
如果webdriver不能这样做,也许还有其他可能吗?
这是一个例子:
<html><head>
<script type="text/javascript">
function fill(){
var i = "secret"
document.forms[0].elements[1].value=i
}
</script>
</head><body onload="fill()">
<form method="POST"><input type="hidden" name="he1" value="">
<input type="hidden" name="he2" value="">
</form></body></html>
Run Code Online (Sandbox Code Playgroud)
显然,我希望webdriver执行dom操作并根据脚本更改表单.
请注意,这只是一个例子.我需要运行的实际脚本做了更复杂的事情.
在PhantomJS 1.9.2上,ubuntu 12 LTS和Ghostdirver 1.04以及selenium 2.35我在测试后得到了悬空的phantomjs进程.任何人都知道如何解决这个问题的好方法?
这是一个演示奇怪行为的测试程序:
package testing;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
public class PhantomIsNotKilledDemo {
private static WebDriver getDriver(){
String browserPathStr = System.getProperty("selenium.pathToBrowser");
if (browserPathStr == null) browserPathStr = "/home/user1/apps/phantomjs/bin/phantomjs";
DesiredCapabilities caps = DesiredCapabilities.phantomjs();
caps.setCapability("takesScreenshot", true);
caps.setCapability(
PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,
browserPathStr );
WebDriver driver = new PhantomJSDriver(caps);
return driver;
}
public static void main(String[] args) {
int max = 10;
for (int i = 0; i < max; i++){
WebDriver d1 = getDriver();
d1.get("http://www.imdb.com/title/tt1951264");
System.out.println("done with …Run Code Online (Sandbox Code Playgroud) 以下是创建Firefox配置文件的方法:
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.dir", download_dir)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","text/csv")
Run Code Online (Sandbox Code Playgroud)
你是如何使用PhantomJS(GhostDriver)的?
我在亚马逊云的Linux服务器上运行Tomcat 6.我正在尝试使用我的办公室Mac上的VisualVM连接到它.我允许打开桌面和服务器之间的所有TCP端口,但我无法让VisualVM做任何事情.
在linux框中,我已经启动了Tomcat:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9191
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
Run Code Online (Sandbox Code Playgroud)
在我的Mac上,我启动VisualVM并选择File - > New JMX Connection ...
我在框中输入amazonhostname.com:9191.它说"添加amazonhostname.com:9191 ......"然后在那里停留几分钟才能超时.
从我的Mac,我可以"telnet amazonhostname.com 9191"就好了,我尝试了一些其他随机端口,他们都工作.我非常确信它不是防火墙问题,除非我需要打开UDP或ICMP或类似的东西.(真??)
服务器上的catalina.log或我的Mac上的系统控制台与jmx无关.服务器上的netstat显示9191,其他一些端口在所有接口上打开.
远程服务器上没有jstatd.这是JMX的先决条件吗?(我对Java完全不熟悉,我甚至不确定那些东西是什么意思,但我在某个博客文章中看到过.我现在正在抓住稻草.)
我试图从这个网站上抓取数据:http://www.bundesliga.de/de/liga/tabelle/
在源代码中,我可以看到表,但没有内容,只是这样的事情:
<td>[no content]</td>
<td>[no content]</td>
<td>[no content]</td>
<td>[no content]</td>
....
Run Code Online (Sandbox Code Playgroud)
使用firebug(Firefox中的F12)我也不会看到任何内容,但我可以选择表格,然后通过firebug选项复制innerHTML.在那种情况下,我得到了关于团队的所有信息,但我不知道如何获取Jsoup中的内容表.
我有代码,有点像这样
String str = "<element data=\"some <data>\"> >foo< </element>";
Document doc = Jsoup.parse(str, "", Parser.xmlParser());
Run Code Online (Sandbox Code Playgroud)
但JSOUP取消了数据的价值,产生了类似的东西
<element value="some <data>">
>foo<
</element>
Run Code Online (Sandbox Code Playgroud)
如何防止JSOUP取消编码属性值?
问题:
是否可以告诉由selenium webdriver控制的浏览器不从外部源加载任何内容,或者不从给定的域列表中加载资源?
底色:
我有一个网页,我用selenium webdriver编写一个基于java的测试脚本 - 我无法更改页面,我只需编写测试.网站从其他域加载的某些外部内容存在问题.外部的东西是我的测试实际上不需要的一些javascript代码,但是有问题的页面包括.现在问题.有时外部源是超级慢的,阻止webdriver在给定的页面加载超时(20秒)内加载页面.我的测试实际上运行正常,因为页面实际上是加载的 - 所有html都在那里,所有内部脚本都被加载并且可以工作.
随便想一想:
有不同浏览器的扩展可以做我要求的,但我需要运行我的测试与几个浏览器,即chrome,firefox和phantomjs.而且没有像phantomjs扩展这样的东西.如果可能的话,我需要一个纯粹基于webdriver技术的解决方案.不过,我愿意为每个浏览器编写一个单独的解决方案.
我很感激有关如何解决这个问题的任何想法.
假设我有一个表格,其中包含有关a的信息
game (PRIMARY INT id, TINYINT offline)
Run Code Online (Sandbox Code Playgroud)
和第二个表格,其中包含有关该游戏的详细信息:
gamedetail (PRIMARY INT id, INT game_id (fk to game table), TINYINT offline)
Run Code Online (Sandbox Code Playgroud)
细节经常更新,并从各种程序.在那里我设置了细节的离线标志.我没有编程设置游戏本身的离线标志的可能性.(我确实将游戏的离线标志设置为0,但是,如果我找到在线详细信息).但我想通过更新查询在数据库中设置此信息.这个想法是这个SELECT:
SELECT DISTINCT game.id FROM game
LEFT JOIN gamedetail AS gdon
ON (gdon.game_id = game.id AND gdon.offline = 0)
LEFT JOIN gamedetail AS gdoff
ON (gdoff.game_id = game.id AND gdoff.offline = 1)
WHERE gdoff.id IS NOT NULL AND gdon.id IS NULL;
Run Code Online (Sandbox Code Playgroud)
这给了我很好的所有游戏,我只有离线游戏细节.所以我想将此作为UPDATE语句的输入,如下所示:
UPDATE game SET game.offline=1 WHERE game id IN (
SELECT DISTINCT game.id FROM game
LEFT JOIN gamedetail AS …Run Code Online (Sandbox Code Playgroud) 我使用@Column(unique=true)
在将数据插入数据库之前检查重复值的最佳做法设置了用户名的唯一约束?
在Windows Phone 8.1应用程序中,我必须按如下方式创建我的套接字.如何更改它以便在我指定的时间段后它会超时?
_socket = new StreamSocket();
await _socket.ConnectAsync(hostName, port.ToString(), SocketProtectionLevel.PlainSocket);
await _socket.InputStream.ReadAsync(frameLenData, frameLenData.Capacity, Windows.Storage.Streams.InputStreamOptions.None);
Run Code Online (Sandbox Code Playgroud)
在我的Windows Phone前代码中,我创建了Socket并通过测试设置超时_event.WaitOne(timeout),例如
timeout = 5000;
_event = new ManualResetEvent(false);
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
bool bOperationFailed = false;
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = new DnsEndPoint(address, port);
_event.Reset();
_socket.ReceiveAsync(socketEventArg);
// Wait for completion
if (_event.WaitOne(timeout) == false)
{
Trace.trace("timed out");
return false;
}
Run Code Online (Sandbox Code Playgroud)
我可以设置StreamSocket's 的超时时间ConnectAsync()吗?如果是这样,怎么样?
我无法PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_PATH_PROPERTY正确设置我的Java程序中的功能,以便从github使用最新版本的Ghostdriver和我安装的phantomjs版本(1.9.1)
这是我在Java程序中所做的
DesiredCapabilities caps = DesiredCapabilities.phantomjs();
caps.setCapability(
PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,
"/xxx/phantomjs-1.9.1-linux-x86_64/bin/phantomjs" );
caps.setCapability(
PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_PATH_PROPERTY,
"/xxx/ghostdriver/src/main.js");
WebDriver driver = new PhantomJSDriver(caps);
Run Code Online (Sandbox Code Playgroud)
selenium驱动程序正确启动,如果我没有设置PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_PATH_PROPERTY,但我在我的测试中得到一些错误,应该在ghostdriver的当前开发人员分支中修复.所以我遵循了这个建议并设置了ghostdriver的cuttent github版本.
但是,现在我收到以下错误:
[ERROR - 2013-07-12T10:22:36.897Z] GhostDriver - Main - Could not start Ghost Driver => {
"message": "Could not start Ghost Driver",
"line": 79,
"sourceId": 140320571924032,
"sourceURL": "/xxx/ghostdriver/src/main.js",
"stack": "Error: Could not start Ghost Driver\n at /xxx/ghostdriver/src/main.js:79",
"stackArray": [
{
"sourceURL": "/xxx/ghostdriver/src/main.js",
"line": 79
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,有谁知道如何解决这个问题?我必须config.js以某种方式更改ghostdriver以使其工作吗?
信息:我 …
我的印象是java支持unicode字符.我做了这个测试,遗憾地发现它失败了.问题是为什么?这是一个错误还是有记录的地方?
// MATHEMATICAL SANS-SERIF ""
String unicodeNum6 = "\uD835\uDFE8";
int codePoint6 = unicodeNum6.codePointAt(0);
int val6 = Character.getNumericValue(codePoint6);
System.out.println("unicodeNum6 = "+ unicodeNum6
+ ", codePoint6 = "+ codePoint6+ ", val6 = "+val6);
int unicodeNum6Int = Integer.parseInt(unicodeNum6);
Run Code Online (Sandbox Code Playgroud)
这失败了 Exception in thread "main" java.lang.NumberFormatException: For input string: ""
意思是我认为,因为println工作并打印预期的行:
unicodeNum6 = , codePoint6 = 120808, val6 = 6
Run Code Online (Sandbox Code Playgroud)
所以Java完全知道unicode字符的数值但不在parseInt中使用它.
有人能说明为什么会失败吗?
java ×6
ghostdriver ×3
phantomjs ×3
jsoup ×2
webdriver ×2
asyncsocket ×1
c# ×1
database ×1
html ×1
integer ×1
iteration ×1
javascript ×1
jedis ×1
jmx ×1
memory-leaks ×1
mysql ×1
redis ×1
selenium ×1
sql-update ×1
tomcat ×1
unicode ×1
unique ×1
visualvm ×1
web-scraping ×1