2017-09-15 116 views
4

因此,我有一个Web应用程序需要收集信息并构建一些报告并运行一些基本的数据分析。Python 3.6.2/Selenium 2.0/AJAX - 如何等待脚本来完成服务器请求

事情是我是一个HTML,Ajax(异步JavaScript和XML),Python和Selenium的完全新手。

我收集到目前为止是这样的:

  1. 阿贾克斯自然是执行异步Web浏览器的活动,并在我的情况,发送服务器的请求推/拉一些数据
  2. 硒处理异步事件进行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进行到下一个请求

Networkflow for the clear button

是否有可能硒看/如果找到一个AJAX动作 结论在Python的页面现实化的行动?

+0

是的,它是可能的,但是这取决于所使用的页面执行Ajax请求的图书馆。我们的想法是等待状态或待处理的请求的数量为0 –

+0

@FlorentB,感谢您的回复。我试图找出有关计算待处理请求的内容,但在Selenium或Ajax Js脚本中找不到任何内容。你有没有一个例子来说明如何进行? – dormanino

+0

没有确切知道页面如何处理请求,一个示例是无用的。为点击添加一个断点并逐步运行代码以找出使用哪个库。 –

回答

0

,如果你在页面上的jQuery,你可以使用jQuery 定义按钮,等待事件功能已准备就绪。 你的问题:

driver.execute_script('button = $("#div_39_1_3");') 
    events = driver.execute_script('return $._data(button[0], 
    "events");') 

现在你需要等到事件变量不是没有。