Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
覆盖webdriver中的javascript变量_Javascript_Jquery_Selenium_Webdriver - Fatal编程技术网

覆盖webdriver中的javascript变量

覆盖webdriver中的javascript变量,javascript,jquery,selenium,webdriver,Javascript,Jquery,Selenium,Webdriver,我不确定是否有任何解决我的问题的方法,但不幸的是,我没有找到任何关于它的文章或信息 情况如下。我们有一个大量使用jQuery的站点,并且有一个每5秒或10秒刷新一部分站点的服务。由于这一半的时间,我从WebDriver得到了这个错误: "Element not found in the cache - perhaps the page has changed since it was looked up" 根据互联网,当DOM树在WebElement初始化和我想使用它执行(例如,单击事件)之间

我不确定是否有任何解决我的问题的方法,但不幸的是,我没有找到任何关于它的文章或信息

情况如下。我们有一个大量使用jQuery的站点,并且有一个每5秒或10秒刷新一部分站点的服务。由于这一半的时间,我从WebDriver得到了这个错误:

"Element not found in the cache - perhaps the page has changed since it was looked up"
根据互联网,当DOM树在WebElement初始化和我想使用它执行(例如,单击事件)之间发生变化时,我得到了这个错误

根据我们的开发人员,我们的jquery解决方案有一个变量,可以控制页面是否刷新。所以,为了解决我的问题,我必须覆盖这个变量。我必须以jQuery能够理解的方式覆盖这个变量——我的意思是在同一个实例中,如果这个定义在这个上下文中是正确的

所以,我想问,这是否可能?如果是这样,我想问一个小例子

提前谢谢


András

您可以尝试我的方法-我为页面可能正在加载的情况创建了自己的包装器。下面的代码部分尝试搜索循环中的元素,持续3秒钟(可配置)。顺便说一句,下面的
driver
变量是
WebDriver

private WebElement foundElement;
public WebElement find(By by){
    for (int milis=0; milis<3000; milis = milis+200){
        try{
            foundElement = driver.findElement(by);
        }catch (Exception e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }

    return foundElement;

}

您可以尝试我的方法-我为可能加载页面的情况创建了自己的包装器。下面的代码部分尝试搜索循环中的元素,持续3秒钟(可配置)。顺便说一句,下面的
driver
变量是
WebDriver

private WebElement foundElement;
public WebElement find(By by){
    for (int milis=0; milis<3000; milis = milis+200){
        try{
            foundElement = driver.findElement(by);
        }catch (Exception e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }

    return foundElement;

}

我相信这是可能的。c#的示例:


我相信这是可能的。c#的示例:


我只能同意亚历

使用
JavaScriptExecutor
是处理此类问题的唯一方法

我在jQueryJnice库中遇到问题,无法找到任何其他解决方案

以下是Java中填充文本字段的示例:

JavascriptExecutor js = (JavascriptExecutor) webDriver;
js.executeScript("document.getElementsByName('<field_name_gets_here>')[0].value='" + your_value + "'");
JavascriptExecutor js=(JavascriptExecutor)webDriver;
js.executeScript(“document.getElementsByName(“”)[0].value='”+your_value+”);

我只能同意亚历赫的观点

使用
JavaScriptExecutor
是处理此类问题的唯一方法

我在jQueryJnice库中遇到问题,无法找到任何其他解决方案

以下是Java中填充文本字段的示例:

JavascriptExecutor js = (JavascriptExecutor) webDriver;
js.executeScript("document.getElementsByName('<field_name_gets_here>')[0].value='" + your_value + "'");
JavascriptExecutor js=(JavascriptExecutor)webDriver;
js.executeScript(“document.getElementsByName(“”)[0].value='”+your_value+”);

如果您提到的JavaScript变量是全局变量,那么是的-您可以通过从Selenium中执行JavaScript来覆盖它。例如,如果该变量名为
doRefresh
,则可以通过如下方式执行JS来覆盖它:
doRefresh=false来自Selenium

如果该变量不是全局变量,则上述操作将不起作用。然而,听起来问题中的元素可能是通过ajax动态加载的——在这种情况下,
xhr
对象是全局的,您可以访问它

因此,首先您可以创建
xhr
对象的本地副本,然后通过从Selenium执行JavaScript覆盖原始副本(有效地禁用它):

// create a copy of the xhr object for later use
var xhrHolder = window.XMLHttpRequest;

// overwrite the original object to disable it
window.XMLHttpRequest = {};
// put the xhr object back
window.XMLHttpRequest = xhrHolder;
然后像平常一样通过硒元素找到你的元素。继续你的测试

完成后,您可以通过从Selenium执行JavaScript将xhr对象放回原位(以便页面可以继续刷新和执行ajax):

// create a copy of the xhr object for later use
var xhrHolder = window.XMLHttpRequest;

// overwrite the original object to disable it
window.XMLHttpRequest = {};
// put the xhr object back
window.XMLHttpRequest = xhrHolder;

如果您提到的JavaScript变量是全局变量,那么是的-您可以通过从Selenium中执行JavaScript来覆盖它。例如,如果该变量名为
doRefresh
,则可以通过如下方式执行JS来覆盖它:
doRefresh=false来自Selenium

如果该变量不是全局变量,则上述操作将不起作用。然而,听起来问题中的元素可能是通过ajax动态加载的——在这种情况下,
xhr
对象是全局的,您可以访问它

因此,首先您可以创建
xhr
对象的本地副本,然后通过从Selenium执行JavaScript覆盖原始副本(有效地禁用它):

// create a copy of the xhr object for later use
var xhrHolder = window.XMLHttpRequest;

// overwrite the original object to disable it
window.XMLHttpRequest = {};
// put the xhr object back
window.XMLHttpRequest = xhrHolder;
然后像平常一样通过硒元素找到你的元素。继续你的测试

完成后,您可以通过从Selenium执行JavaScript将xhr对象放回原位(以便页面可以继续刷新和执行ajax):

// create a copy of the xhr object for later use
var xhrHolder = window.XMLHttpRequest;

// overwrite the original object to disable it
window.XMLHttpRequest = {};
// put the xhr object back
window.XMLHttpRequest = xhrHolder;

我无法提供代码,因为它属于我们的客户。另一方面,没有必要,因为我不知道示例代码应该包含什么。我认为有一种方法可以描述问题所在。如果没有,我会再试一次。:)因此,您的问题与测试用例有关,而不是与实际实现有关?是的,我想知道是否可以通过webdriver操纵javascript变量,以及是否可以通过这种方式操纵站点的整个行为。@SayusiAndo:您使用的是什么编程语言?Java、C#、Python还是什么?@SayusiAndo:我知道你不能提供代码,因为这是秘密。请您提供类似的其他代码(不是您的项目代码,因为您不想透露),以便更容易向您提供具体答案。我不能提供代码,因为它是我们的客户所有的。另一方面,没有必要,因为我不知道示例代码应该包含什么。我认为有一种方法可以描述问题所在。如果没有,我会再试一次。:)因此,您的问题与测试用例有关,而不是与实际实现有关?是的,我想知道是否可以通过webdriver操纵javascript变量,以及是否可以通过这种方式操纵站点的整个行为。@SayusiAndo:您使用的是什么编程语言?Java、C#、Python还是什么?@SayusiAndo:我知道你不能提供代码,因为这是秘密。你能提供类似的其他代码(不是你的项目代码吗