选择下拉框不会在 Edge 浏览器上为 Python Selenium WebDriver 激活确认对话框 window

Selecting drop down box does not activate confirm dialog window on Edge browser for Python Selenium WebDriver

我在使用 Microsoft Edge 上的下拉框时遇到问题。 Chrome、Firefox 或 IE (v9-11) 不会出现此问题。

我在其他网络浏览器的代码中用于 select 下拉框的命令是 Select 命令:

Select(driver.find_element_by_id("active_config")).select_by_visible_text(configFile)

一旦配置文件被 selected,就会出现一个对话框,要求用户确认更改。但是在Edge上,selected配置文件显示在下拉框中,但不知为何,一直没有弹出确认配置文件更改的对话框,所以测试失败。

当我 [使用我的鼠标] 手动测试场景时,它工作正常。我还使用睡眠计时器 [在我的测试中] 和鼠标来确认 Edge 被 Selenium 启动时没有问题,因为我很少遇到这种情况。几乎就好像当文件被 selected 时,它并没有以导致执行确认对话框操作的方式被 selected。我已经尝试了下面的各种方法,但似乎没有任何效果。

driver.find_element_by_xpath("//select[@id='active_config']/option[text()='" + configFile + "']").double_click()

<>

menu = driver.find_element_by_id("active_config")
submenu = driver.find_element_by_xpath("//select[@id='active_config']/option[text()='" + configFile + "']")
ActionChains(driver).move_to_element(menu).click(submenu).perform()

<>

Select(driver.find_element_by_id("active_config")).select_by_visible_text(configFile)
driver.find_element_by_id("active_config").send_keys(Keys.ENTER)

<>

driver.find_element_by_xpath("//select[@id='active_config']/option").click()
Select(self.driver.find_element_by_id("active_config")).select_by_visible_text(configFile)

<>

Select(driver.find_element_by_id("active_config")).select_by_visible_text(configFile)
Select(driver.find_element_by_id("active_config")).select_by_visible_text(configFile)

<>

Select(driver.find_element_by_id("active_config")).select_by_visible_text(configFile)
driver.find_element_by_id("active_config").send_keys(Keys.NULL)

<>

  success = False
     tries = 0
     while success == False:
         try:
             Select(driver.find_element_by_id("active_config")).select_by_visible_text(configFile)
             assertExpectedConditionTrue(self.driver, "By.LINK_TEXT", "Activate "+ configFile)
             success == True
         except NoSuchElementException:
             tries = tries + 1
             if tries == 3:
                 raise Exception ("EDGE WON'T SELECT NEW PROFILE")
             else:
                 time.sleep(1)

<>

driver.find_element_by_xpath("//select[@id='active_config']/option[text()='" + configFile + "']").click()

<>

Select(driver.find_element_by_xpath("//select[@id='active_config']")).select_by_visible_text(configFile)

在这一点上,我很困惑,不知道该尝试什么。建议??

解决方案是使用动作链。

.move_to_element().click()Select() 不适用于边缘。在 Chrome、Firefox 和 IE 上,我可以指向下拉列表的位置,配置文件列表将被 returned。

driver.find_element_by_id("active_config")

- 或 -

driver.find_element_by_xpath("//select[@id='active_config']")

Edge 的情况并非如此。当我指向 Edge 上的相同位置时,它 return 什么也没有。我怀疑这就是为什么 'on charge' 事件永远不会发生,即使使用 Select() 会在框中显示我想要激活的配置文件。我在 Edge 上的其他下拉列表中也遇到了同样的问题。奇怪的是,如果我分别指向列表中的每个项目,我可以让 Selenium 达到 return 它的值。

driver.find_element_by_xpath("//select[@id='active_config']/option[1]")
driver.find_element_by_xpath("//select[@id='active_config']/option[2]")
driver.find_element_by_xpath("//select[@id='active_config']/option[3]")
ect...

因此,我必须执行以下操作才能解决我的问题:

  1. 创建一个包含所有配置文件的列表。

            active_config_list = []
            num_of_active_configs = 0
            new_config_loc = None
            curr_config_loc = None
            try:
                while True:
                    active_config_list.append(self.driver.find_element_by_xpath("//select[@id='active_config']/option[" + str(num_of_active_configs + 1) + "]").text)
                    num_of_active_configs = num_of_active_configs + 1
            except NoSuchElementException:
                pass
    
  2. 存储活动配置文件和我要激活的配置文件的位置。这样,我就知道需要按下 'arrow up' 或 'arrow down' 键以突出显示我想要的配置文件的次数。

            for cnt in xrange(0, num_of_active_configs):
                if self.ncdFile == active_config_list[cnt]:
                    new_config_loc = cnt + 1
                    if not re.search (r"No .ncd file is active.", self.driver.find_element_by_id("active_conf").text) == None:
                        curr_config_loc = 1
                        break
                    else:
                        active_config_string = self.driver.find_element_by_id("active_conf").text.split()
                        for cnt in xrange(0, num_of_active_configs):
                            if str(active_config_string[0]) == active_config_list[cnt]:
                                curr_config_loc = cnt + 1
                                break
                    break
    
  3. 使用动作链激活列表,使用箭头键 select 所需的配置文件,然后按 Enter。

        menu = self.driver.find_element_by_id("active_config")
    
        ActionChains(self.driver).move_to_element(menu).click(menu).perform()
        if curr_config_loc < new_config_loc:
            for x in xrange(0, new_config_loc - curr_config_loc):
                ActionChains(self.driver).key_down(Keys.ARROW_DOWN).perform()
        elif curr_config_loc > new_config_loc:
            for x in xrange(0, curr_config_loc - new_config_loc):
                ActionChains(self.driver).key_down(Keys.ARROW_UP).perform()
        ActionChains(self.driver).key_down(Keys.ENTER).perform()