private void WaitForInitalization() { var wait = WrappedDriver.Wait(TimeSpan.FromSeconds(10)); var timeoutMS = wait.Timeout.TotalMilliseconds; var pollingMS = wait.PollingInterval.TotalMilliseconds; var script = AddTinyMCEUtilities(String.Empty) + "var el = {args}[0];" + "var editor = tinyMCEUtilities.getEditor(el);" + "tinyMCEUtilities.waitForInitialization(editor," + $"{timeoutMS}," + $"{pollingMS}," + "{resolve}," + "{reject});"; script = JavaScript.RemoveComments(script); script = JavaScript.Clean(script); var waiter = new PromiseBody(WrappedDriver) { Arguments = new[] { new JavaScriptValue(WrappedElement) }, Script = script }; // Condense the script. waiter.Format(); waiter.Execute(WrappedDriver.JavaScriptExecutor()); wait.Until(d => waiter.Finished); waiter.Wait(TimeSpan.FromSeconds(10)); }
/// <summary> /// Since kendo events aren't compatible with native js events use this /// method to listen for kendo events. /// </summary> /// <param name="eventName">Name of the event to listen for.</param> protected virtual PromiseBody GetPromiseForKendoEvent( string eventName) { var script = "var callback = {resolve};" + "var $el = $({args}[0]);" + "var dropdown = $el.data().kendoDropDownList;" + "var unbindCallback = function () {" + $"dropdown.unbind('{eventName}', unbindCallback);" + "callback();" + "};" + $"dropdown.bind('{eventName}', unbindCallback);"; var promise = new PromiseBody(WrappedDriver) { Arguments = new JavaScriptValue[] { new JavaScriptValue(WrappedElement) }, Script = script }; promise.Execute(WrappedDriver.JavaScriptExecutor()); return(promise); }
private void UpdateIntegrationMode() { if (TinyMCEContainerElement.FindElements(By.TagName("iframe")).Any()) { // Only classic mode uses iframes. IntegrationMode = IntegrationMode.Classic; } else { // Could be either classic or distraction free. var script = "var el = arguments[0];" + "var editor = tinyMCEUtilities.getEditor(el);" + "if (editor == null) {" + "return false;" + "} else {" + "return editor.getParam('theme') === 'inlite';" + "}"; script = AddTinyMCEUtilities(script); var isDistractionFreeMode = (bool)WrappedDriver .JavaScriptExecutor() .ExecuteScript(script, WrappedElement); IntegrationMode = isDistractionFreeMode ? IntegrationMode.DistractionFree : IntegrationMode.Inline; } }
/// <summary> /// Waits for the <c>dataName</c> to be defined on the /// $(WrappedElement).data() object. Assumes that <c>WrappedElement</c> /// has been assigned to. /// </summary> /// <param name="dataName"> /// Name of the property on the data object. /// </param> /// <param name="timeout">The timeout.</param> protected virtual void WaitForInitialization(string dataName, TimeSpan timeout) { var js = WrappedDriver.JavaScriptExecutor(); var script = $"var el = arguments[0];" + $"return '{dataName}' in $(el).data();"; WrappedDriver.Wait(timeout) .Until(d => (bool)js.ExecuteScript(script, WrappedElement)); }
/// <summary> /// Gets the content of the editor. This calls the /// tinyMCE.Editor.getContent(). /// </summary> /// <returns></returns> public virtual string GetContent() { var script = AddTinyMCEUtilities() + "var el = arguments[0];" + "var editor = tinyMCEUtilities.getEditor(el);" + "return editor == null ? null : editor.getContent();"; script = JavaScript.RemoveComments(script); script = JavaScript.Clean(script); return((string)WrappedDriver.JavaScriptExecutor() .ExecuteScript(script, WrappedElement)); }
/// <summary> /// Sets the cursor position (the point {0,0} will be the top left /// corner). /// </summary> /// <param name="point">The point.</param> public virtual void SetCursorPosition(Point point) { var script = AddTinyMCEUtilities() + $"var el = arguments[0];" + $"var editor = tinyMCEUtilities.getEditor(el);" + $"tinyMCEUtilities.setCaretPosition(editor, {point.X}, {point.Y});" + // This is to scroll the line into view. $"editor.execCommand('mceInsertContent', false, '');"; WrappedDriver .JavaScriptExecutor() .ExecuteScript(script, WrappedElement); }
/// <summary> /// Gets all availble tags that can be created via autocomplete. /// </summary> /// <returns></returns> public virtual IEnumerable <string> GetAllAutoCompleteOptions() { var js = new JavaScript { Script = "var $el = $(arguments[0]);" + "return $el.data().options.autocomplete.source;", Arguments = new[] { new JavaScriptValue(WrappedElement) } }; var result = js.Execute(WrappedDriver.JavaScriptExecutor()); return(result.ToStringArray()); }
/// <summary> /// Gets the data object. /// </summary> /// <returns></returns> protected JObject GetData() { var script = Resources.jsonFormatterCallback + "var el = arguments[0];" + "var dataObj = $(el).data().datepicker;" + "return JSON.stringify(dataObj, jsonFormatter);"; var dataStr = (string)WrappedDriver .JavaScriptExecutor() .ExecuteScript(script, WrappedElement); return(JObject.Parse(dataStr)); }
/// <summary> /// If overriding don't forget to call base.Load() or make sure to /// assign the WrappedElement. /// </summary> /// <returns></returns> public override ILoadableComponent Load() { base.Load(); InputContainerElement = WrappedElement.GetParentElement(); // Locate the generated calendar modal element. var script = new JavaScript { Script = "var $el = $(arguments[0]);" + "return $el.data().kendoDatePicker.dateView.div[0]", Arguments = new[] { new JavaScriptValue(WrappedElement) } }; ModalContainerElement = script .Execute(WrappedDriver.JavaScriptExecutor()) .ToWebElement(); return(this); }
/// <summary> /// Hightlights the range. /// </summary> /// <param name="startPoint">The start.</param> /// <param name="endPoint">The end.</param> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentOutOfRangeException"> /// Thrown if the start point is before the end point. /// </exception> public virtual void HightlightRange(Point startPoint, Point endPoint) { // Validate arguments. if (startPoint == null) { throw new ArgumentNullException(nameof(startPoint)); } else if (endPoint == null) { throw new ArgumentNullException(nameof(endPoint)); } if (startPoint.Y > endPoint.Y) { throw new ArgumentOutOfRangeException(nameof(startPoint)); } else if (startPoint.Y == endPoint.Y && startPoint.X > endPoint.X) { throw new ArgumentOutOfRangeException(nameof(endPoint)); } // This is to set the start point & end point into view. Both // points are used to (if possible) get both points into view. SetCursorPosition(startPoint); SetCursorPosition(endPoint); var script = AddTinyMCEUtilities() + $"var el = arguments[0];" + $"var editor = tinyMCEUtilities.getEditor(el);" + $"tinyMCEUtilities.highlight(editor," + $"{startPoint.X}," + $"{startPoint.Y}," + $"{endPoint.X}," + $"{endPoint.Y});"; WrappedDriver .JavaScriptExecutor() .ExecuteScript(script, WrappedElement); }
/// <summary> /// Gets the cursor position. /// </summary> /// <returns></returns> public virtual Point GetCursorPosition() { var script = AddTinyMCEUtilities() + "var el = arguments[0];" + "var ed = tinyMCEUtilities.getEditor(el);" + "console.log(ed);" + "return JSON.stringify(tinyMCEUtilities.getCaretPosition(ed))"; script = JavaScript.RemoveComments(script); script = JavaScript.Clean(script); var result = (string)WrappedDriver .JavaScriptExecutor() .ExecuteScript(script, WrappedElement); var jsObj = JObject.Parse(result); var point = new Point( jsObj["x"].ToObject <int>(), jsObj["y"].ToObject <int>()); return(point); }
/// <summary> /// If overriding don't forget to call base.Load() or make sure to /// assign the WrappedElement. /// </summary> /// <returns></returns> /// <exception cref="NoSuchElementException"></exception> public override ILoadableComponent Load() { base.Load(); WaitForInitalization(); var script = new JavaScript { Arguments = new[] { new JavaScriptValue(WrappedElement) }, IsAsync = false, Script = JavaScript.Clean( JavaScript.RemoveComments( AddTinyMCEUtilities() + "var el = arguments[0];" + "var editor = tinyMCEUtilities.getEditor(el);" + "return editor == null ? null : editor.getContainer();")) }; TinyMCEContainerElement = script.Execute( WrappedDriver.JavaScriptExecutor()) .ToWebElement(); if (TinyMCEContainerElement == null) { throw new NoSuchElementException(); } UpdateIntegrationMode(); if (IntegrationMode == IntegrationMode.Classic) { iframeElement = new IFrameElement( TinyMCEContainerElement .FindElement(By.TagName("iframe")) .UnWrapEventFiringWebElement(), WrappedDriver); } // Menu. if (TinyMCEContainerElement.FindElements(menuComponentSelector).Any()) { Menu = pageObjectFactory.PrepareComponent( new MenuComponent(menuComponentSelector, pageObjectFactory, WrappedDriver)); } else { Menu = null; } // Toolbar. if (TinyMCEContainerElement.FindElements(toolbarComponentSelector).Any()) { Toolbar = pageObjectFactory.PrepareComponent( new ToolbarComponent( toolbarComponentSelector, pageObjectFactory, WrappedDriver)); } else { Toolbar = null; } // Status bar. if (TinyMCEContainerElement.FindElements(statusbarComponentSelector).Any()) { Statusbar = pageObjectFactory.PrepareComponent( new StatusbarComponent(statusbarComponentSelector, pageObjectFactory, WrappedDriver)); } else { Statusbar = null; } return(this); }
/// <summary> /// Gets the options. /// </summary> /// <returns></returns> protected JObject GetOptions() { var script = Resources.jsonFormatterCallback + "var optNames = [" + "altField," + "altFormat," + "appendText," + "autoSize," + "beforeShow," + "beforeShowDay," + "buttonImage," + "buttonImageOnly," + "buttonText," + "calculateWeek," + "changeMonth," + "changeYear," + "closeText," + "constrainInput," + "currentText," + "dateFormat," + "dayNames," + "dayNamesMin," + "dayNamesShort," + "defaultDate," + "duration," + "firstDay," + "gotoCurrent," + "hideIfNoPrevNext," + "isRTL," + "maxDate," + "minDate," + "monthNames," + "monthNamesShort," + "navigationAsDateFormat," + "nextText," + "numberOfMonths," + "onChangeMonthYear," + "onClose," + "onSelect," + "prevText," + "selectOtherMonths," + "shortYearCutoff," + "showAnim," + "showButtonPanel," + "showCurrentAtPos," + "showMonthAfterYear," + "showOn," + "showOptions," + "showOtherMonths," + "showWeek," + "stepMonths," + "weekHeader," + "yearRange," + "yearSuffix" + "];" + "var el = arguments[0];" + "var opt = { };" + "for (var i = 0; i < optNames.length; i++ {" + "var optName = optNames[i];" + "var val = $(el).data().datapicker('option', optNames[i]); " + "opt[optName] = val;" + "}" + "return JSON.stringify(opt, jsonFormatter);"; var optionsStr = (string)WrappedDriver .JavaScriptExecutor() .ExecuteScript(script, WrappedElement); return(JObject.Parse(optionsStr)); }