问题启动webdriver远程会话-TypeError:字符串索引必须是整数

时间:2018-01-26 21:20:49

标签: python selenium firefox selenium-webdriver gecko

这是我第一次尝试编写python脚本 -

我正在尝试在IIS服务器上的localhost上运行测试用例。这是当地的环境。我做了以下更改:

  1. 将Firefox设置更改为“无代理”
  2. 在IIS中配置并重定向的网址,以便' 127.0.0.1'点 到网站。因此,在浏览器中输入127.0.0.1重定向到 IIS中的本地网站
  3. 我必须始终'允许' /'阻止' geoLocation警报和Firefox需要浏览器功能才能设置。

    因此,

    1. 我创建了一个新的Firefox个人资料
    2. 设置它的首选项,以便“允许”'警告geoLocation 服务
    3. 将socks proxy设置为127.0.0.1
    4. 设置所需的功能
    5. 以下是代码:

      class CheckGeoLocationsDropDown():
      
              def test_check_geo_locations_dropdown(self):
      
                  try:
      
                      selenium_profile = webdriver.FirefoxProfile()
      
      
      # media.navigator.permission.disabled is set in the FF to   True, however, as FF creates new Profile, do not know how to do. 
      
      #selenium_profile.set_preference('media.navigator.permission.disabled', True)
      
                      # Setting no proxy or socks proxy to 127.0.0.1 and port 80
                      selenium_profile.set_preference("network.proxy.socks", '127.0.0.1')
                      selenium_profile.set_preference("network.proxy.socks_port", 80)
                      selenium_profile.update_preferences()
      
                      baseUrl = 'http://127.0.0.1:80'
                      # os.environ['no_proxy'] = '127.0.0.1:80'
      
                      # Create a desired capabilities object as a starting point.
                      capabilities = DesiredCapabilities.FIREFOX.copy()
                      capabilities['platform'] ="WINDOWS"
                      capabilities['version'] = "7"
                      capabilities['nativeEvents'] = True
                      capabilities['unexpectedAlertBehaviour'] = 'Accept'
      
                      # Instantiate an instance of Remote WebDriver with the desired capabilities.
                      driver = webdriver.Remote(desired_capabilities=capabilities,
                                                command_executor='http://127.0.0.1:80',
                                                browser_profile=selenium_profile)
      
                    #driver.find_element_by_css_selector('#exceptionDialogButton')
                      driver.maximize_window()
      
                      driver.get(baseUrl)
      
              # driver.find_element_by_css_selector('#exceptionDialogButton')
              # _select_geo_locations_dropdown(driver)
              # print(driver.title)
      
                      driver.implicitly_wait(5)
                      driver.refresh()
                      driver.close()
      
                      item = '*'
                      print(item * 40 + 'Geo Locations Dropdown selected successfully' + item * 40)
      
              except NoSuchElementException:
                  print("Couldn't Run Script")
      
      ff = CheckGeoLocationsDropDown()
      ff.test_check_geo_locations_dropdown()
      

      以下是我得到的错误 enter image description here

      我尝试阅读Python文档,但是我无法找到我在这里做错了什么。如果我没有提供足够的信息,请接受我的道歉。任何帮助,将不胜感激。

      更新时间:1/29/201:

      所以我需要检测地理定位权限请求警报。我应该能够允许/阻止地理位置共享。由于Selenium为每个实例创建了一个新的FF配置文件,因此我设置了首选项selenium_profile.set_preference('media.navigator.permission.‌​disabled', True)

      我现在已添加到

      capabilities['nativeEvents'] = True
      capabilities['unexpectedAlertBehaviour'] = 'Accept'
      

      它仍然犯同样的错误。

      参考使用:

1 个答案:

答案 0 :(得分:0)

使用错误堆栈跟踪的内容提供的信息很难回答/推荐任何内容。但是我能够成功地重现这个问题。

如果查看selenium.webdriver.remote.webdriver的当前实现,则将其定义为:

class selenium.webdriver.remote.webdriver.WebDriver(command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities=None, browser_profile=None, proxy=None, keep_alive=False, file_detector=None, options=None)

如果您查看公共方法 set_preference(self, key, value)的源代码,我们可以在配置文件中配置以下首选项:

self.default_preferences[key] = value

首选项列表

  • set_preference(" webdriver_firefox_port",self._port)
  • set_preference(" webdriver_accept_untrusted_certs",value)
  • set_preference(" webdriver_assume_untrusted_issuer",value)
  • set_preference(" webdriver_enable_native_events",value)
  • set_preference(" network.proxy.type",proxy.proxy_type [' ff_value'])
  • set_preference(" network.proxy.no_proxies_on",proxy.no_proxy)
  • set_preference(" network.proxy.autoconfig_url",proxy.proxy_autoconfig_url)
  • set_preference(" network.proxy。%s"%key,host_details [0])
  • set_preference(" network.proxy。%s_port"%key,int(host_details 2))

我没有找到与您提到的偏好匹配的偏好:

set_preference('media.navigator.permission.disabled', True)

因此您会看到错误。

更新

根据您的问题更新,您需要检测地理位置权限并能够允许/阻止地理位置共享,您可以添加以下代码行:

opt.add_experimental_option("prefs", { \
    "profile.default_content_setting_values.geolocation": 1, 
  })

您可以找到详细的讨论here