加载仪表板后,Selenium在IE11上找不到任何元素



所以有趣的事情正在发生-不幸的是,我不能发布一个url或一些东西你们可以访问,所以也许有人只是有一个想法的原因可能是什么。我认为这是一种正在开发的东西。无论如何…

我有一个测试,它登录到一个应用程序,然后加载一个仪表板并搜索一些数据。在Firefox中,一切都很好。然而,IE11有一个问题,一旦它登录。因此,Selenium工作得很好,直到它加载仪表板,然后它将一无所获。甚至不是"//html"。它给出了基本元素未发现的错误。我假设开发人员已经编写了一些阻止访问的东西,但我与之交谈的人并不确定。

你知道是什么原因导致的吗?这样我就可以给开发人员提建议了。同样,这在Firefox中不会发生,这也可能表明IE11出了问题(尽管Selenium在其他应用程序上工作得很好,直到这个应用程序的仪表板屏幕)。如果你需要更多的信息,请告诉我——只是要知道我可能没有太多可以提供的。

有几点需要注意:

1.  it is https protocol, but so is the login page
2.  at the end of the url bar, it says there is a certificate error that will not go away 
no matter what I do (I have added the supposedly correct certificates).

我在用什么:

Selenium 2.4.5
32 bit IEDriverServer
Python 2.7.8
IE11 (other IE versions are not supported, so I cannot compare)
Windows 7
编辑:

我和一个开发人员谈过,他能想到的最好的事情就是仪表板大量使用多边形填充,这可能就是Selenium没有发现任何东西的原因。话虽如此,当涉及到polyfills时,是否有一种方法可以使用Selenium找到元素?或者硒只是不打算为它工作。

:

下面是一些代码,相当于我的测试将要做的。假设每个异常通常都会被捕获,并且不会终止脚本…

from pdb import set_trace
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
url = 'server.url'
capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER
capabilities['acceptSslCerts'] = True
# use path due to having both a 64 bit and 32 bit version of the driver - specifies which to use
driver = webdriver.Ie("path-to-iedriver.exe", capabilities=capabilities)
driver.maximize_window()
driver.get("https://%s" % url)
# click ie's continue to website
driver.get("javascript:document.getElementById('overridelink').click();")
time.sleep(1)
# clicks 'I Agree' on a page before login
driver.find_element_by_xpath("//button[text()='I Agree']").click()
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'username')))
# logs in
driver.find_element_by_id("username").send_keys("username")
driver.find_element_by_name("j_password").send_keys("password")
driver.find_element_by_xpath("//button[contains(text(), 'Log on')]").click()
# click continue when a successful login box pops up
ret = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.ID, "continueBtn")))
ret.click()
# this waits for an element on the dashboard page - it will fail
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//span[contains(text(), 'banner')]")))
# everything from here on will fail due to element not found (only in IE)
driver.find_element_by_xpath("//html")
driver.find_element_by_xpath("anything")
set_trace()

同样,这些元素可以在Firefox和Chrome中找到,但不能在IE中找到。

您可能需要添加一个Explicit Wait来等待数据加载。例如,您可以等待一个特定的元素出现:

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
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
# proceed with locating the elements containing the desired data

老回答

听起来这是一个证书问题,一旦页面加载,打印出.title.page_source并检查那里有什么。

您也可以通过将acceptSslCerts所需的能力设置为True来让它接受证书:

from selenium import webdriver
capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER
capabilities['acceptSslCerts'] = True
driver = webdriver.Ie(capabilities=capabilities)
# ...

也看到:

  • 如何使用硒处理证书?