如何通过 Selenium 和 Python 中的 IEDriverServer 使用 DesiredCapabilities 类

Mer*_*yem 5 python selenium internet-explorer selenium-webdriver selenium-iedriver

由于某种原因,我一直在努力使用在 IE11 中工作的简单 python 脚本,它无法找到任何元素,但是通过在 Java 代码中设置一些所需的功能,它可以工作:

System.setProperty("webdriver.ie.driver", "C:\\Python27\\IEDriverServer.exe");
DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
ieCapabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
WebDriver driver = new InternetExplorerDriver(ieCapabilities);//
driver.navigate().to("http://www.google.com");
WebElement search =driver.findElement(By.name("q"));
search.sendKeys("selenium");
search.submit(); 
Run Code Online (Sandbox Code Playgroud)

但是,由于我已经在 python 中编写了我的测试,我想在 python 中使用相同的方法:

caps = DesiredCapabilities.INTERNETEXPLORER
caps['executablePath'] = 'C:\\Python27\\IEDriverServer.exe'
caps['InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS'] = True
browser = webdriver.Ie(capabilities=caps)
browser.get('https://google.com')
search = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.NAME, 'q')))
search.send_keys("selenium")
search.submit()
Run Code Online (Sandbox Code Playgroud)

但是由于某种原因,selenium 仍然无法找到搜索栏,所以我猜我在 python 中写的等价物是不正确的,有人可以指出我正确的方向吗?

Deb*_*anB 3

您必须注意以下几个事实:

  • DesiredCapabilities.INTERNETEXPLORER您需要使用而不是使用DesiredCapabilities.INTERNETEXPLORER.copy()

注意:始终附加.copy()DesiredCapability对象上,以避免更改 Global 类实例的副作用。

  • 根据所需功能的实现, executablePath()没有任何有效的论点。executable_path相反,在初始化WebDriver / WebClient时传递参数。
  • 正如您添加了该选项一样,根据博客You're Doing It Wrong: IE Protected Mode and WebDriverintroduceFlakinessByIgnoringSecurityDomains() @JimEvans中的讨论,明确提到添加可能会让您克服最初的异常,并允许测试在大多数情况下运行,而无需事件。然而,使用此功能并不能解决根本问题。如果跨越保护模式边界,则可能会发生非常意外的行为,包括挂起元素位置不起作用以及点击未传播INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS
  • 当您将字符序列发送到Google 搜索框而不是presence_of_element_located()使用方法时element_to_be_clickable()

  • 这是您自己的代码,经过一些修改:

    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    cap = DesiredCapabilities.INTERNETEXPLORER.copy()
    cap['INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS'] = True
    driver = webdriver.Ie(capabilities=cap, executable_path=r'C:\Utility\BrowserDrivers\IEDriverServer.exe')
    driver.get('https://google.com')
    search = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME, 'q')))
    search.send_keys("selenium")
    search.submit()
    
    Run Code Online (Sandbox Code Playgroud)

浏览器快照

google_search_selenium_ie


参考

在这里您可以找到有关启动 Internet Explorer 时出现意外错误的详细讨论。IELaunchURL() 使用 Selenium 3.13.0 返回 HRESULT 80070012:IEDriverServer_x64_3.13.0