【问题标题】:How to access a Button with Selenium, when the button seems to be generated from JavaScript当按钮似乎是从 JavaScript 生成时,如何使用 Selenium 访问按钮
【发布时间】:2014-06-29 13:58:40
【问题描述】:

我尝试在网页上运行一些测试。我是初学者,到目前为止一切都很顺利。

我正在更改网络表单中的一些值,现在想要按“保存并退出”按钮。

但是当我使用 webdriver (driver.getPageSource();) 查看可用源时,我没有看到按钮,只有下面的 JavaScript。我将脚本缩短为一个按钮 - 我想点击的那个按钮。

function getToolbarCfg() {
  return [{ btnId: 2, icon:'images/obj16/tsave_.gif', text:'Save & Exit', qtip:'Save Record and Exit', handler:function() { cwc.getCenterWindow().tpzExecute('2',null,'detail'); } }];

感谢任何帮助。

【问题讨论】:

    标签: java javascript selenium selenium-webdriver


    【解决方案1】:

    您可以让 WebDriver 显式等待元素出现。

        public static IWebElement WaitForElementToAppear(IWebDriver driver, int waitTime, By waitingElement)
        {
            IWebElement wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTime)).Until(ExpectedConditions.ElementExists(waitingElement));
            return wait;
        }
    

    阅读Selenium's WebDriver Wait Documentation,了解显式和隐式等待的详细说明。

    编辑:

    您也可以这样做:

    public static IWebElement WaitForElementToAppear(IWebDriver driver, int waitTime, By waitingElement)
        {
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTime));
            var element = wait.Until(d =>
            {
                var elem = driver.FindElement(waitingElement);
                if (elem.Enabled)
                    return elem;
                else return null;
            });
            return element;
        }
    

    这将每 0.5 秒对元素执行一次 ping 操作,直到定义了任何 waitTime 或为 OR 直到元素存在。

    【讨论】:

      【解决方案2】:

      找到解决方案:

      单击该按钮时正在执行 JavaScript。可以使用 Selenium WebDriver 直接调用该 JavaScript 函数。

      ((JavascriptExecutor) driver).executeScript("cwc.getCenterWindow().tpzExecute('3',null,'detail');");
      

      希望这个答案能帮助遇到同样问题的人。

      【讨论】:

      • 如果对我完美的工作解决方案投了反对票的人至少可以解释他决定这样做的原因,那就太好了。
      • 抱歉,昨晚尝试发表评论时遇到问题。我投反对票的原因是直接执行 JavaScript 并没有真正测试应用程序。您说您正在编写测试,但实际上您并没有证明这些按钮正在工作甚至在那里。简而言之,您的测试并没有像用户那样做。在尝试测试网页时,使用 JavaScript 绝对是最后的手段。您是否尝试过等待按钮出现在 DOM 中?是否需要触发鼠标悬停等事件?
      • 嗯,这是很好的输入。谢谢你。我已经让我的线程休眠了 2 秒。在那个间隔之后按钮不存在。您对我如何通过实际按下按钮来模拟更多“用户喜欢的场景”有什么建议吗?
      • 您可以发布指向公众网站的链接吗?
      • 您可以让 Selenium 等到页面上出现某个按钮,然后单击该按钮。一个问题是在 HTML 中没有统一的方式来表示按钮。另一个原因是click() 并不总是有效 - 因此有时仍然需要执行一些 JavaScript。这不会降低 RobbieWareham 言论的有效性。
      猜你喜欢
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 2016-08-27
      • 2021-11-18
      • 2022-01-03
      • 2021-07-15
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多