Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.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
Python 强制Selenium等待AngularJS_Python_Angularjs_Selenium - Fatal编程技术网

Python 强制Selenium等待AngularJS

Python 强制Selenium等待AngularJS,python,angularjs,selenium,Python,Angularjs,Selenium,我怎样才能强迫python Selenium等待一秒钟,直到AngularJS完成页面解析并加载它所需要的东西 或者,我如何强制Selenium在单击按钮后等待1秒,这会导致ajax请求服务器,由AngularJS处理。在导航到其他页面之前,我需要执行服务器端操作。通过Selenium访问AngularJS范围-最有可能的是,该状态已保留在scope/IsolatedScope中 我构建了一些扩展来帮助实现这一点,这些扩展可以翻译成python webDriver.NgWaitFor(produ

我怎样才能强迫python Selenium等待一秒钟,直到AngularJS完成页面解析并加载它所需要的东西


或者,我如何强制Selenium在单击按钮后等待1秒,这会导致ajax请求服务器,由AngularJS处理。在导航到其他页面之前,我需要执行服务器端操作。

通过Selenium访问AngularJS范围-最有可能的是,该状态已保留在scope/IsolatedScope中

我构建了一些扩展来帮助实现这一点,这些扩展可以翻译成python

webDriver.NgWaitFor(productDiv, "scope.Data.Id != 0");
webDriver.NgWaitFor(partialElement, "scope.IsBusyLoadingTemplate == false");

要在处理angularjs$http和jquery时处理ajax请求,我使用:

webDriver.WaitFor("window.isBrowserBusy() == false");
需要在angularjs和jquery中设置拦截,以管理xhr请求的计数

以下是我们在项目中使用的框架:(您可能希望从中提取更多片段)


我也有同样的问题,这是我解决问题的方法

from datetime import datetime, timedelta
from time import sleep

from selenium import webdriver
from selenium.common.exceptions import WebDriverException


class MyDriver(webdriver.Chrome):
    def __init__(self, executable_path="chromedriver", port=0,
                 chrome_options=None, service_args=None,
                 desired_capabilities=None, service_log_path=None):
        super().__init__(executable_path, port, chrome_options, service_args,
                         desired_capabilities, service_log_path)

    def wait_until_angular(self, seconds: int = 10) -> None:
        java_script_to_load_angular = "var injector = window.angular.element('body').injector(); " \
                                      "var $http = injector.get('$http');" \
                                      "return ($http.pendingRequests.length === 0);"
        end_time = datetime.utcnow() + timedelta(seconds=seconds)
        print("wait for Angular Elements....")
        while datetime.utcnow() < end_time:
            try:
                if self.execute_script(java_script_to_load_angular):
                    return
            except WebDriverException:
                continue
            sleep(1)
        raise TimeoutError("waiting for angular elements for too long")
从datetime导入datetime,timedelta
从时间上导入睡眠
从selenium导入webdriver
从selenium.common.exceptions导入WebDriverException
类MyDriver(webdriver.Chrome):
def uuu init uuuu(self,executable_path=“chromedriver”,端口=0,
chrome\u options=None,service\u args=None,
所需的\u功能=无,服务\u日志\u路径=无):
super().uuu init_uuu(可执行文件路径、端口、chrome选项、服务参数、,
所需的功能、服务日志路径)
def等待直到角度(自身,秒数:int=10)->无:
java_script_to_load_angular=“var injector=window.angular.element('body').injector();”\
“var$http=injector.get('$http');”\
“返回($http.pendingRequests.length==0);”
end_time=datetime.utcnow()+timedelta(秒=秒)
打印(“等待角度元素…”)
而datetime.utcnow()
它对我有用
希望这对你有帮助

如果应用程序中的某些异步行为非常重要,以至于真正的用户应该等待,那么您应该告诉他们。同样,您的脚本可以在继续之前等待相同的指示

例如,如果用户单击触发API调用以创建记录的按钮,并且用户需要等待该记录的创建,则您应该向他们显示一条消息,指示记录成功完成的时间,例如“record created successfully”。然后,您的脚本可以像用户一样等待相同的文本出现

重要的是,应用程序如何实现并不重要。重要的是您的用户可以使用您的应用程序,而不是它调用某些AngularJS API或React API等

1.使用硒 Selenium包括和帮助您等待满足特定条件的模块:

通过导入从selenium.webdriver.common.by导入 从selenium.webdriver.support将预期的_条件导入为EC 从selenium.webdriver.support.ui导入WebDriverWait 超时=5 # ... WebDriverWait(驱动程序,超时)。直到( EC.text_to_be_present_in_元素( [By.CLASS_NAME,“警报”], “已成功创建记录”))
2.使用水豚(使用硒) 正如您在上面看到的,裸硒是复杂而挑剔的。将大部分内容抽象出来:

from capybara.dsl import page

# ...

page.assert_text("Record created successfully")