Selenium的一个问题是,当一个页面大量使用AJAX请求时,Selenium不知道请求何时完成,因此何时应该开始查询所请求元素的页面。
我解决这个问题的想法是在每次AJAX请求完成时在页面中放置一个包含计数器的div
:
<!-- will be v1v after first AJAX requext, v2v after the second etc. -->
<div style="display: none;" id="ajaxcounter">v0v</div>
所以在Selenium测试代码中我可以输出这样的行:
WebDriverWait(self.driver, 10).until(
text_to_be_present_in_element((By.ID, "ajaxcounter"), "v1v")
)
# test stuff that depends on the first AJAX request
然而,上面一行提出selenium.common.exceptions.TimeoutException
,因为显然Selenium拒绝&#34;看到&#34;使用style="display: none;"
的元素的内容(如果我删除此display: none;
,则Selenium可以正常工作)。
是否有可能让Selenium看到这个看不见的元素?它通常可以抱怨任何其他不可见的元素,但它仍然只能看到这一个元素。
答案 0 :(得分:1)
你可以使用像等待ajax&#39;完成。
public void WaitForAjax(int timeoutSecs = 10)
{
for (var i = 0; i < timeoutSecs; i++)
{
var ajaxIsComplete = (bool) _browser.ExecuteScript("return jQuery.active == 0");
if (ajaxIsComplete) return;
Thread.Sleep(100); //retry interval
}
}
答案 1 :(得分:0)
您有多种选择。我推荐这个:
WebDriverWait(self.driver, 10).until(
presence_of_element_located((By.XPATH, "//*[@id='ajaxcounter' and text()='v1v']"))
)
Xpath会找到id
是&#39; ajaxcounter&#39;的元素。文字是&#39; v1v&#39;。