因此,我有一个Web应用程序需要收集信息并构建一些报告并运行一些基本的数据分析。Python 3.6.2/Selenium 2.0/AJAX - 如何等待脚本来完成服务器请求
事情是我是一个HTML,Ajax(异步JavaScript和XML),Python和Selenium的完全新手。
我收集到目前为止是这样的:
- 阿贾克斯自然是执行异步Web浏览器的活动,并在我的情况,发送服务器的请求推/拉一些数据
- 硒处理异步事件进行
Wait
类似的动作:- time.sleep('time in ms')#使用时间库。所以不是真的硒;
- 显式等待:您定义在进一步继续执行代码之前等待某种条件发生;
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
delay_time = 10 # how much time until raises NoExeption in Selenium
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
webDriverWait(driver,delay_time)\
.until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))`
EC代表由下式表示预期条件:
title_is;
title_contains;
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present
- 隐等待:告诉webdriver的轮询DOM(文档对象模型)进行一定量的时间尝试时找到一个或多个元素,如果他们不是立即可用的竹叶提取;
driver.implicitly_wait(10)
- - 使用Java执行JavaScript并应用等待:j Query保留一个Ajax调用在其query.active变量中有效的计数;
- FluentWait:FluentWait选项来处理不确定的等待;
- WebdriverWait:使用ExpectedCondition和WebDriverWait策略。
使用什么,因为我有以下情况:
按钮通过Ajax发出了明确的要求。
<div id="div_39_1_3" class="Button CoachView CPP BPMHSectionChild CoachView_show" data-type="com.ibm.bpm.coach.Snapshot_b24acf10_7ca3_40fa_b73f_782cddfd48e6.Button" data-binding="local.clearButton" data-bindingtype="boolean" data-config="config175" data-viewid="GhostClear" data-eventid="boundaryEvent_42" data-ibmbpm-layoutpreview="horizontal" control-name="/GhostClear">
<button class="btn btn-labeled"><span class="btn-label icon fa fa-times"></span>Clear</button></div>
这是按钮的事件: function(a) {!e._instance.btn.disabled && c.ui.executeEventHandlingFunction(e, e._proto.EVT_ONCLICK) && (e._instance.multiClicks || (e._instance.btn.disabled = !0, f.add(e._instance.btn, "disabled")), e.context.binding && e.context.binding.set("value", !0), e.context.trigger(function(a) { e._instance.btn.disabled = !1; f.remove(e._instance.btn, "disabled"); setTimeout(function() { c.ui.executeEventHandlingFunction(e, e._proto.EVT_ONBOUNDARYEVT, a.status) }) }, { callBackForAll: !0 })) }
然后,我的网络通知的ajaxCoach进行到下一个请求
是否有可能硒看/如果找到一个AJAX动作 结论在Python的页面现实化的行动?
是的,它是可能的,但是这取决于所使用的页面执行Ajax请求的图书馆。我们的想法是等待状态或待处理的请求的数量为0 –
@FlorentB,感谢您的回复。我试图找出有关计算待处理请求的内容,但在Selenium或Ajax Js脚本中找不到任何内容。你有没有一个例子来说明如何进行? – dormanino
没有确切知道页面如何处理请求,一个示例是无用的。为点击添加一个断点并逐步运行代码以找出使用哪个库。 –