【问题标题】:Selenium Web-Driver Firefox Profile - Disable popup and alert windowsSelenium Web-Driver Firefox 配置文件 - 禁用弹出和警报窗口
【发布时间】:2019-11-30 02:18:45
【问题描述】:

我在某些网站上遇到问题,当我尝试切换到其他 URL 甚至关闭浏览器时,我的浏览器会提示警报。一些例子:

为了使用 Selenium 解决警报,我需要切换到该警报,然后有时接受它有时拒绝它(取决于警报的内容)。

我希望避免以这种方式解决这个问题,因为:

  1. 我需要猜测我应该接受警报还是拒绝警报。

  2. 切换到警报有时会引发异常,即使警报存在。

我需要在 Firefox 配置文件中设置哪些首选项,以防止浏览器发出此类警报(或任何其他警报)?

非常感谢使用 Java 或 Python 提供的答案。

谢谢

【问题讨论】:

    标签: java python selenium selenium-webdriver


    【解决方案1】:

    据我所知,您只能全局禁用该行为。 有一个名为 dom.disable_beforeunload 的首选项。您应该将其值更改为 true。使用 Selenium,您可以创建新的自定义 Firefox 配置文件:

    FirefoxProfile customProfile = new FirefoxProfile();
    customProfile.setPreference("dom.disable_beforeunload", true);
    FirefoxDriver driver = new FirefoxDriver(customProfile);
    

    【讨论】:

      【解决方案2】:

      据我所知,无法禁用警报等原生浏览器事件,因此您只需要更好地处理它们即可。

      1) 您应该能够使用alert.getText() 就是否接受或关闭警报做出明智的决定。

      try { 
           WebDriverWait wait = new WebDriverWait(driver, 2); 
           wait.until(ExpectedConditions.alertIsPresent());
           Alert alert = driver.switchTo().alert();
           if ( alert.getText().contains("Are you sure you want to leave this page?")) {
               alert.accept();
           }
           else if ( alert.getText().contains("Some other text which means you need to dismiss")) {
               alert.dismiss();
           }
           else {
               //something else
           }
      }
      catch (Exception e) {
      
      }
      

      2) 使用 WebDriverWait 来避免竞争条件。见上文

      【讨论】:

      • 由于上述原因,我对处理警报不感兴趣。为了强调这一点,各种警报具有各种不同的文本,无法从中推断应该接受还是拒绝警报。
      • 而且没有任何赛车问题。一旦您尝试离开该网站(或者转到其他网站,或者完全关闭浏览器),就会出现警报。
      • 1) 也许可以使用 getType 来确定是否可以接受或拒绝警报。 2) 2 中抛出了什么异常?如果它是 AlertNotPresent,那么你有一个竞争条件,你的代码在浏览器完成显示警报之前执行。请记住,这可能是肉眼看不到的。
      • 谢谢。就我而言,第二个问题不太重要。我的问题真的是,让那些警报开始。据我所知,警报没有“getType”之类的东西。它只包含两个选项,我需要选择其中一个。也许正确的术语是“提示窗口”或“确认窗口”而不是“警报窗口”。
      • 对不起,getType 是一个 C# 的东西,它没有按照我的想法做。查看修改后的答案,是否有某些原因您不能像这样使用 getText?
      【解决方案3】:

      我认为 Firefox 配置文件不会禁用此类特定元素,但您可以硬编码一些静态逻辑行,在测试用例/项目中保持一致。

      在主页点赞会自动关闭grooveshark.com上的弹框/提示信息

          @Test
        public void testUntitled() throws Exception {
          driver.get(baseUrl + "/#!/genre/Rap/1748"); //complete URL becomes http://grooveshark.com/#!/genre/Rap/1748
          driver.findElement(By.linkText("more…")).click(); // clicks a hyper-link which opens up that frame/pop-up
          driver.findElement(By.id("lightbox-outer")).click(); // clicks outside the opened-up frame, or simply clicks on the main page in background
        }
      

      lightbox-outer 是主页。

      【讨论】:

      • 能否为每一行添加一个简短的描述?
      【解决方案4】:

      您不能禁用弹出窗口(警报),只需执行 alert.accept() 表示单击警报模式的 ok 按钮或 alert.dismiss() 表示单击取消或关闭按钮。

      在这种情况下,最糟糕的是,如果您不确定是否会出现警报,则需要等待一段时间。

      如果由于事件成功而出现警报(就像单击按钮,网页要求您确认)您不需要等待wait.until(ExpectedConditions.alertIsPresent()); 您可以通过将驱动程序切换到警报的下一步来节省时间。即

       Alert alert = driver.switchTo().alert();
           if ( alert.getText().contains("Are you sure you want to leave this page?")) {
               alert.accept();
           }
           else if ( alert.getText().contains("Some other text which means you need to dismiss")) {
               alert.dismiss();
           }
           else {
               //something else
           }
      }
      

      只是为了确保您可以使用较短的等待时间,但是对于加载网页时出现警报的情况,是的,这取决于加载网页的网络速度。

      【讨论】:

      • 如果您在全局范围内禁用这些行为,通过配置您的个人资料,该个人资料将不会出现任何警报。您需要知道这对我们的应用程序有多方便。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 2020-09-06
      • 2014-06-02
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多