选择下拉框不会在 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...
因此,我必须执行以下操作才能解决我的问题:
创建一个包含所有配置文件的列表。
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
存储活动配置文件和我要激活的配置文件的位置。这样,我就知道需要按下 '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
使用动作链激活列表,使用箭头键 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()
我在使用 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...
因此,我必须执行以下操作才能解决我的问题:
创建一个包含所有配置文件的列表。
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
存储活动配置文件和我要激活的配置文件的位置。这样,我就知道需要按下 '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
使用动作链激活列表,使用箭头键 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()