如何让Selenium看到不可见的元素?

如何让Selenium看到不可见的元素?,selenium,Selenium,Selenium的一个问题是,当页面大量使用AJAX请求时,Selenium不知道请求何时完成,因此不知道何时应该开始查询页面以获取请求的元素 我解决这个问题的想法是在页面中放置一个不可见的div,该div包含一个计数器,每次AJAX请求完成时计数器都会递增: v0v 因此,在Selenium测试代码中,我可以这样写: WebDriverWait(self.driver,10)。直到( 文本在元素((By.ID,“ajaxcounter”),“v1v”)中显示 ) #测试依赖于第一个AJAX

Selenium的一个问题是,当页面大量使用AJAX请求时,Selenium不知道请求何时完成,因此不知道何时应该开始查询页面以获取请求的元素

我解决这个问题的想法是在页面中放置一个不可见的
div
,该div包含一个计数器,每次AJAX请求完成时计数器都会递增:


v0v
因此,在Selenium测试代码中,我可以这样写:

WebDriverWait(self.driver,10)。直到(
文本在元素((By.ID,“ajaxcounter”),“v1v”)中显示
)
#测试依赖于第一个AJAX请求的内容
但是,上面这一行引发了
selenium.common.exceptions.TimeoutException
,因为显然selenium拒绝使用
style=“display:none;”“
”来“查看”元素的内容(如果我删除这个
display:none;
,那么selenium就可以正常工作)


有没有可能让Selenium看到这个不可见的元素?它通常可以抱怨任何其他不可见的元素,但仍然应该只看到这一个元素。

您有多种选择。我建议:

WebDriverWait(self.driver, 10).until(
    presence_of_element_located((By.XPATH, "//*[@id='ajaxcounter' and text()='v1v']"))
)

Xpath将找到元素,
id
是“ajaxcounter”,文本是“v1v”。

您可以使用类似“等待ajax”的内容来完成

    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
        }
    }
public void WaitForAjax(int-timeoutSecs=10)
{
对于(变量i=0;i
您确定这与您无关吗: