Xcode UI Testing - Drag and Drop - xcode

I'm trying to create XCTestCase to test reordering in my outline view (in OS X app). When I use UI Test Recording feature, Xcode prints this:
window.outlines.staticTexts["<cell which I want to move>"].click()
I tried dragging the cell both inside or outside outline view, Xcode generates the same useless code.
Does anyone know how to test drag & drop correctly in Xcode 7?

Not sure if this is new, but in Xcode 7.2, if you look at the header for XCUIElement, there's a clickForDuration(thenDragToElement:) function for OS X. Seems to work for me with NSOutlineView.
This is from the header...
/*!
* Clicks and holds for a specified duration (generally long enough to start a drag operation) then drags
* to the other element.
*/
public func clickForDuration(duration: NSTimeInterval, thenDragToElement otherElement: XCUIElement)

With Xcode 9.4.1
Swift:
func press(forDuration duration: TimeInterval, thenDragTo otherElement: XCUIElement)
Example:
let ele: XCUIElement = XCUIApplication()!.otherElements.matching(identifier: "element_identifier").element(boundBy: 0)
ele.press(forDuration: <timeIntervalInSec>, thenDragTo: <destination_XCUIElement>)
Refer: API Doc

Same issue. No solution. Looks like accessibility does not support d-n-d, and Apple docs say: Provide alternatives for drag-and-drop operations.

The only thing I can suggest is to try checking the accessibility features of the code being tested. UI Testing needs to have accessibility information to be able to understand what is happening in the UI. See the Apple WWDC15 UI Testing video at about 39:30 into the video for an example of how to fix issues where UI recording can't properly generate code.

Related

Can I make a Xamarin.Form app (iOS) support Apple Dynamic Type?

In Apple iOS Settings > Display & Brightness there is the ability to change the size of text for applications that use Dynamic Type.
Is it possible to do this with Xamarin.Forms app (iOS custom rendere maybe). If so can someone give an example of how to do this for something like a TableSection Heading and a Label?
For iOS you need for XF TableView TableViewRenderer with native control of UITableView. More here:
https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/renderers/
To avoid duplicated answer I will just provide a link
With a custom renderer can I make a TableSection.Title appear in small mixed case?

WKWebView Mac Browser Enable fullscreen html5?

I made a simple browser with Swift last version and xcode 8.3.3.
I want to be able to enter in fullscreen when there is an html5 video (like on youtube).
I get "full screen is unavailable" on youtube right now.
Same problem with the old WebView... on iOS it work.
EDIT. Maybe it's just not possible. I tried to look at JavaFX WebView and WPF WebBrowser and they have the same limitation. Actually one guy was able to allow full screen for a youtube video on WPF WebBrowser but only by creating a full html page:
Playing youtube in full screen in WebBrowser control
And of course I cannot create a webpage for every video in a page (at least I don't know how, if you know please tell me).
ORIGINAL MESSAGE:
I made a simple browser with Swift last version and xcode 8.3.3.
Everything is working but I'm not able to activate plugins like I can do with the old WebView.
Since I'm on a mac I should be able to activate plugins (I understand that it's not possible on iOS) am I wrong?
Also (and here I got the same problem in the old WebView) there is no way to activate fullscreen for html5 videos (at least I don't know how).
#IBOutlet weak var webView: WKWebView!
let urlString = "http://myurl.com/"
self.webView.load(NSURLRequest(url: NSURL(string: urlString)! as URL) as URLRequest!)
self.webView.configuration.preferences.plugInsEnabled = true
This is the really basic code to get a basic browser working. But there is no option to enable plugin in the Interface Builder for WKWebView and I really don't know how to allow fullscreen for html5 videos (like youtube).
EDIT. Ok I finally found an answer for the plugin part:
self.webView.configuration.preferences.plugInsEnabled = true
really easy but it was difficult to understand where to find it I had to go here:
https://developer.apple.com/documentation/webkit/webpreferences
and take a guess...
Update for macOS 12.3
Starting on iOS 15.4 and macOS 12.3 WKPreferences has the new property isElementFullscreenEnabled. Now it is very simple:
myWebView.configuration.preferences.isElementFullscreenEnabled = true
Original answer (pre macOS 12.3)
Instead of using private APIs you can do this by changing the property with KVO in the configuration.
Using Swift 5:
let configuration = WKWebViewConfiguration()
configuration.preferences.setValue(true, forKey: "fullScreenEnabled")
let webView = WKWebView(frame: .zero, configuration: configuration)
Tested on macOS 10.15 and 11
To allow WKWebView to use fullscreen HTML you need to access private API's (see https://github.com/WebKit/webkit/blob/master/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm#L232-L240) in WKPreferences. Since you're using Swift in your bridging header add:
#import <WebKit/WebKit.h>
#interface WKPreferences ()
-(void)_setFullScreenEnabled:(BOOL)fullScreenEnabled;
#end
And simply call it:
let webView = WKWebView(frame: view.frame)
webView.configuration.preferences._setFullScreenEnabled(true)
If you notice strange resizing of the web view once you exit fullscreen I found that this fixes the issue for me:
webView.autoresizingMask = [.width, .height]
view.addSubview(webView)
webView.translatesAutoresizingMaskIntoConstraints = false
webView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
Note: Since you're accessing private API this would be rejected on the Mac App Store.
The solution posted by #SoneeJohn was clear, but it involved using a bridging header. I'd never manually worked with Objective-C or modified private Swift frameworks before. I didn't know what keywords to use. And, the resources I found seemed more involved and focused on creating an original framework - not altering an existing framework. I don't know if this is the proper implementation, but it got full-screen mode to work in web view.
Steps
There are photos that reference each of the following steps in the next section.
Click your "Project" in XCode
Click "Add a target"
Click "Cocoa Framework"
Click "Next"
Enter a title into "Product Name"
Click "Finish"
Click "Add items" in "Linked Frameworks and Libraries"
Enter "WebKit" into the "Search"
Click "WebKit.framework"
Click "Add"
Click your "Project.h" file
Add the "Import" code from the solution
#import <WebKit/WebKit.h>
Add the "Full Screen" code from the solution
#interface WKPreferences ()
-(void)_setFullScreenEnabled:(BOOL)fullScreenEnabled;
#end
Import your "Project Framework" into your swift file
Implement the "Full Screen" code into your web view
webView.configuration.preferences._setFullScreenEnabled(true)
I had to change my user agent to Safari 11 for the full-screen mode to work properly.
webView.customUserAgent = """
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13) AppleWebKit/604.1.31 (KHTML, like Gecko) Version/11.0 Safari/604.1.31
"""
The answer is that there is no answer. No API right now on mac to get fullscreen html5. I tried to make the same app on windows and the current WebView of UWP is able to go fullscreen (the old WebBrowser of WPF is not able to go fullscreen).
I think the only way to get it, it's to submit a feedback to apple.

NSApplicationPresentationOptions doesn't work with FIREBREATH

I am trying to customize user experience from the plugin I am working on, my goal is to provide a kiosk style using the options available in COCOA NSApplication, the code is like following:
// Hide the dock tile and the menu bar:
NSApplicationPresentationOptions options =
NSApplicationPresentationHideDock + NSApplicationPresentationHideMenuBar;
[NSApp setPresentationOptions:options];
I have tested this code using a normal cocoa application and it works fine but when I embed this code in a function inside a "Firebreath PlugIn" nothing happens although the firebreath builds correctly and the other functions I have works normally.
some ideas? this is about system security restrictions maybe?? if so how to enable it? I don't know why this doesn't work if other cocoa functions works fine.
I am developing over Mac OS X Lion with XCODE 4.2
My guess is that you can't get tot he NSApplication because you are in a different process; you might be able to create a fake one or something like that with a new NSWindow to make it work, but since you're in a different process from the browser there is no way to access the browser's NSApp or other similar objects.

How to implement a UITabBar view in Mac OS X applications?

In my Mac application I'd like to implement a view that simulates UITabBar from iOS.
What's the preferred way to implement this? Use NSOutlineView , NSTableView, or something else?
For a native Mac app, the equivalent of a UITabBar is an NSTabView. If you want to go for the iOS look, you either have to roll your own with some NSView subclass or take a look at UMEKit.
Chameleon may also be an option, but it currently doesn't implement UITabBar, this might change in the future.
If you want to follow a trend of making your Mac app with the UIKit look-and-feel
you might want to take a look at the Chameleon Project - note the status of the project on the developer's blog. However, the project source is on github now, and people are helping out.

How to start working with Xcode

I am developing an iPhone Native App. So can any tell me how to start working with Xcode? I have created Hello world program. My requirement is "I am having 2 drop down list and a button, where both the drop down list are fetching data from DB." I tried searching for drop down list in Interface Builder but unable to find it. Can anyone guide me how can I proceed for this?
Thanks in advance.
-Ankit
There's no such thing as a "drop down list" with the default interface elements in iOS. You'll either want to use a UIPickerView or a UITableView, depending on your application.
The easiest way to get started with UITableView is to use Xcode to create a new Navigation-Based app with Core Data for storage. This will setup most of the basic stuff for you and you can either tweak it to suit your needs or you can just see how the interface and data elements interact with each other.

Resources