gpt4 book ai didi

javascript - 评估中的异常

转载 作者:行者123 更新时间:2023-11-30 06:41:52 25 4
gpt4 key购买 nike

我正在尝试与一个编码相当糟糕且速度极慢的网站进行交互。我将举例说明我遇到的问题:

在这个网页上有 2 个选择框,第一个用于选择国家,onchange 向网络服务器发出 AJAX 请求,然后返回城市列表。此列表用于填充第二个选择框。现在的问题是我可以使用 phanomtjs 的页面对象中的评估函数来遍历第一个选择框并选择正确的选项。但在那之后我必须等待 n 秒才能填充第二个框。目前我已经通过设置一个定时器等待 25 秒然后从第二个框中选择城市来“解决”这个问题。然而,这是一个非常糟糕的解决方案。首先,25 秒在所有情况下都不够长,所以有时它会超时并失败。第二个问题是,在大多数情况下,25 秒太长了。

所以我必须找到一种方法来等待第二个框被填充。起初我虽然可以在求值函数中使用 setInterval 来测试选择框是否被填充。这行得通,但有一个问题,因为 setInterval 是异步的,使用这种方法我无法确定是否可以做出正确的选择。为了说明我的意思,下面的代码是我不需要等待时它是如何工作的:

var retval = page.evaluate(function () {
return selectOption('select_id',
info['country']);
});

那个 selectOption 是一个函数,它遍历选择元素,直到它找到正确的选项元素,如果失败,它返回 false,然后这个返回值由被评估的函数返回,所以我可以检查它是否有效。

另一种选择是在网页上下文中使用 setInterval 进行等待,如果失败则引发异常。我试过这样做,但我似乎无法捕捉到网站范围之外的异常。 PhantomJS 将异常转储到终端中,但我无法拦截它。

有什么办法解决这个问题吗?还是我应该只使用固定等待时间选项?

编辑:我尝试使用 page.onError,但它似乎没有被使用。

最佳答案

我还需要查明评估函数中是否抛出了异常。我设法通过添加另一个层来做到这一点,该层只是用 try-catch 包装函数:

// Wrap a function (func) inside a try-catch block and return
// the exception if any. Otherwise return null. The ctx is a
// a bucket for all the variables to be passed to func.
var tryCatchWrapper = function(func, ctx) {
try {
funct(ctx);
}
catch(e) {
return e;
}

return null;
}

然后评估 somefunction 我这样使用它:

var error = page.evaluate(tryCatchWrapper, somefunction);
if (error) {
handle error...
}

如果我希望将参数传递给 func,那么我会使用上下文对象。有关如何将变量参数传递给函数的不同方法,请查看问题:"JavaScript variable number of arguments to function" .

关于javascript - 评估中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com