Python 强制Selenium等待AngularJS
我怎样才能强迫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
或者,我如何强制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")