如何让Selenium看到隐形元素?

时间:2017-08-24 17:08:30

标签: selenium

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看到这个看不见的元素?它通常可以抱怨任何其他不可见的元素,但它仍然只能看到这一个元素。

2 个答案:

答案 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;。