Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 388 Vote(s) - 3.49 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Replicate pull to refresh in XCTest UI testing

#1
I am trying to replicate a pull to refresh on a `UITableView` using the new Xcode UI testing framework in Xcode 7 (beta 3)

My current approach is dragging from the table to whatever element below the table I can find. This works when there is a fixed item below the table like a `UIToolbar` or `UITabBar` I would rather not rely on having a `UITabBar` or `UIToolbar` but I can't figure out a way to do the pull to refresh/drag action without using the method in `XCUIElement`.

func pressForDuration(duration: NSTimeInterval, thenDragToElement otherElement: XCUIElement)


![Refresh success][1]

But it fails when I don't have a toolbar/tabbar and try to drag using the cells

![Refresh failure][2]

This is the relevant portion of my code:

func testRefresh() {
//For testing cell
for _ in 0...9 {
addCell()
}
refreshTable()
}

func refreshTable(var tbl: XCUIElement? = nil) {
let app = XCUIApplication()

if tbl == nil {
let tables = app.tables
if tables.count > 0 {
tbl = tables.elementAtIndex(0)
}
}

guard let table = tbl else {
XCTFail("Cannot find a table to refresh, you can provide on explicitly if you do have a table")
return
}

var topElement = table
let bottomElement: XCUIElement?

//Try to drag to a tab bar then to a toolbar then to the last cell
if app.tabBars.count > 0 {
bottomElement = app.tabBars.elementAtIndex(0)
}
else if app.toolbars.count > 0 {
bottomElement = app.toolbars.elementAtIndex(0)
}
else {
let cells = app.cells
if cells.count > 0 {
topElement = cells.elementAtIndex(0)
bottomElement = cells.elementAtIndex(cells.count - 1)
}
else {
bottomElement = nil
}
}
if let dragTo = bottomElement {
topElement.pressForDuration(0.1, thenDragToElement: dragTo)
}
}

func addCell() {
let app = XCUIApplication()
app.navigationBars["Master"].buttons["Add"].tap()
}


Additional failed attempts:

- `swipeDown()` (multiples times as well)
- `scrollByDeltaX/deltaY` (OS X only)

[1]:

[2]:
Reply

#2
Here is a Swift 5.1 version

```swift
let firstCell = staticTexts["Id"]
let start = firstCell.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))
let finish = firstCell.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 100))
start.press(forDuration: 0, thenDragTo: finish)
```
Reply

#3
I managed to do such tasks with coordinates like Joe suggested. But i went a step further using `coordinateWithOffset()`

let startPosition = CGPointMake(200, 300)
let endPosition = CGPointMake(200, 0)
let start = elementToSwipeOn.coordinateWithNormalizedOffset(CGVectorMake(0, 0)).coordinateWithOffset(CGVector(dx: startPosition.x, dy: startPosition.y))
let finish = elementToSwipeOn.coordinateWithNormalizedOffset(CGVector(dx: 0, dy: 0)).coordinateWithOffset(CGVector(dx: endPosition.x, dy: endPosition.y))
start.pressForDuration(0, thenDragToCoordinate: finish)

Now i am able to drag from a specific point to another specific point. I implemented a custom refresh on some of my views. While implementing this, i also discovered that i can even use this to access the control center or the top menu.
Reply

#4
You can use the [`XCUICoordinate`](

[To see links please register here]

) API to interact with specific points on the screen, not necessarily tied to any particular element.

1. Grab a reference to the first cell in your table. Then create a coordinate with zero offset, `CGVectorMake(0, 0)`. This will normalize a point right on top of the first cell.
2. Create an imaginary coordinate farther down the screen. (I've found that a `dy` of six is the smallest amount needed to trigger the pull-to-refresh gesture.)
3. Execute the gesture by grabbing the first coordinate and dragging it to the second one.

[![enter image description here][1]][1]

let firstCell = app.staticTexts["Adrienne"]
let start = firstCell.coordinateWithNormalizedOffset(CGVectorMake(0, 0))
let finish = firstCell.coordinateWithNormalizedOffset(CGVectorMake(0, 6))
start.pressForDuration(0, thenDragToCoordinate: finish)

[More information](

[To see links please register here]

) along with a [working sample app](

[To see links please register here]

) is also available.


[1]:
Reply



Forum Jump:


Users browsing this thread:
2 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through