mirror of
https://github.com/appium/appium.git
synced 2026-11-01 14:58:00 +08:00
Compare commits
74
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a56f0f820a | ||
|
|
b88ff49f80 | ||
|
|
5bde635d19 | ||
|
|
175b7acc27 | ||
|
|
507f2ba8b5 | ||
|
|
1ae1fe9c44 | ||
|
|
c70faded35 | ||
|
|
e922e9738c | ||
|
|
0899725aab | ||
|
|
62be085f95 | ||
|
|
cb9fb9c6fe | ||
|
|
82c5caf0b5 | ||
|
|
bcbb8ee86e | ||
|
|
980aa69b93 | ||
|
|
1cae549a7b | ||
|
|
ef163eb8df | ||
|
|
8c3b3005be | ||
|
|
056baba3a0 | ||
|
|
0ee7716cf0 | ||
|
|
3d674d0085 | ||
|
|
bbe3b6c6e5 | ||
|
|
42d7ed8afe | ||
|
|
5b8cb76ea3 | ||
|
|
d5959902bc | ||
|
|
1d066073dc | ||
|
|
048ce520d8 | ||
|
|
19fb9d608f | ||
|
|
38afce5ea5 | ||
|
|
63cb664af1 | ||
|
|
51c3063194 | ||
|
|
750872af47 | ||
|
|
32645ba726 | ||
|
|
f5f0aa5068 | ||
|
|
00dc1eddaa | ||
|
|
3bf1eaf5a9 | ||
|
|
75710ab823 | ||
|
|
7fe67a286a | ||
|
|
38cc8a343f | ||
|
|
511ff11220 | ||
|
|
ce36003edb | ||
|
|
0e51b9b8b9 | ||
|
|
da3f9ff881 | ||
|
|
dcb6de22ea | ||
|
|
8f20c973f4 | ||
|
|
89e8d2e4d4 | ||
|
|
b692914a95 | ||
|
|
a83f8eee9b | ||
|
|
f583e99e60 | ||
|
|
21dd13e5e5 | ||
|
|
45681602c0 | ||
|
|
efdb1ce6ce | ||
|
|
b6c97cd11e | ||
|
|
fedabb1fdc | ||
|
|
49ac8126a2 | ||
|
|
894c193150 | ||
|
|
688af4ddb4 | ||
|
|
c8e7fa642f | ||
|
|
449dbe9a5c | ||
|
|
2468aeca60 | ||
|
|
9a66f48001 | ||
|
|
ec04635925 | ||
|
|
035e30b892 | ||
|
|
893fc040e1 | ||
|
|
482a1f7bbf | ||
|
|
d17d022224 | ||
|
|
46085635a9 | ||
|
|
db28605532 | ||
|
|
a5ea99aacd | ||
|
|
880111b0ff | ||
|
|
d6cdd3b05f | ||
|
|
326942d8ac | ||
|
|
622b245ea3 | ||
|
|
5034f1afc6 | ||
|
|
a97f3893e6 |
+4
-1
@@ -1,6 +1,9 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": ["github>appium/appium//renovate/default"],
|
||||
"schedule": ["after 10pm and before 5:00am"],
|
||||
"schedule": [
|
||||
"after 10pm",
|
||||
"before 5:00am"
|
||||
],
|
||||
"timezone": "America/Vancouver"
|
||||
}
|
||||
|
||||
+3
-3
@@ -31,18 +31,18 @@ contributors!
|
||||
|
||||
## Gold Sponsors
|
||||
|
||||
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/gold-sponsor.svg?avatarHeight=100&button=false"/></a>
|
||||
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/gold-sponsor.svg?avatarHeight=100&button=false&random=1"/></a>
|
||||
|
||||
[Become a Gold Sponsor](https://opencollective.com/appium/contribute/gold-sponsor-72877/checkout?interval=month&amount=500&contributeAs=me)
|
||||
|
||||
## Silver Sponsors
|
||||
|
||||
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/silver-sponsor.svg?avatarHeight=80&button=false"/></a>
|
||||
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/silver-sponsor.svg?avatarHeight=80&button=false&random=1"/></a>
|
||||
|
||||
[Become a Silver Sponsor](https://opencollective.com/appium/contribute/silver-sponsor-72876/checkout?interval=month&amount=250&contributeAs=me)
|
||||
|
||||
## Bronze Sponsors
|
||||
|
||||
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/sponsors.svg?avatarHeight=60&button=false"/></a>
|
||||
<a href="https://opencollective.com/appium" target="_blank"><img src="https://opencollective.com/appium/tiers/sponsors.svg?avatarHeight=60&button=false&random=1"/></a>
|
||||
|
||||
[Become a Bronze Sponsor](https://opencollective.com/appium/contribute/sponsors-70690/checkout?interval=month&amount=100&contributeAs=me)
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
This documentation is a note for the opencollective payout.
|
||||
|
||||
1. Select `Submit expense`
|
||||
2. Select `Invoice`
|
||||
3. Type proper account name in `Who is being paid for this expense?`
|
||||
- The form depends on the target user
|
||||
4. Select `Next`
|
||||
5. Input expense info and complete the form. Then, the user will recieve the expense info.
|
||||
- Expense title: `<year-month> contribution payout`
|
||||
- e.g. `2024-07 contribution payout`
|
||||
- Description in "Set invoice details"
|
||||
- for TCs:
|
||||
- `<year-month> contribution as a TC https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee and maintaining Appium project itself (development, review etc)`
|
||||
- i.e. `2024-07 contribution as a TC https://github.com/appium/appium/blob/master/GOVERNANCE.md#the-technical-committee and maintaining Appium project itself (development, review etc)`
|
||||
- for individuals
|
||||
- `PR contribution: <PRs>` for PRs. `Community contribution in Q&A forum at https://discuss.appium.io/` for appium forums
|
||||
- E.g.
|
||||
- `PR contribution: https://github.com/appium/dotnet-client/pull/810, https://github.com/appium/dotnet-client/pull/808`
|
||||
- `PR contribution: https://github.com/appium/java-client/pull/2206, https://github.com/appium/java-client/pull/2203 and a few PRs`
|
||||
- `Community contribution in Q&A forum at https://discuss.appium.io/`
|
||||
- Amount
|
||||
- Type the amount in `USD`
|
||||
6. Approve each expense after getting response for each expense
|
||||
|
||||
<img width="500" alt="Screenshot 2024-09-11 at 8 40 35 PM" src="https://github.com/user-attachments/assets/462cda69-1ce7-458c-b319-dda87cf10d65">
|
||||
Generated
+1776
-1545
File diff suppressed because it is too large
Load Diff
+17
-17
@@ -83,18 +83,18 @@
|
||||
"devDependencies": {
|
||||
"@colors/colors": "1.6.0",
|
||||
"@tsconfig/node14": "14.1.2",
|
||||
"@types/chai": "4.3.17",
|
||||
"@types/chai-as-promised": "7.1.8",
|
||||
"@types/diff": "5.2.1",
|
||||
"@types/mocha": "10.0.7",
|
||||
"@types/node": "20.14.14",
|
||||
"@types/chai": "4.3.19",
|
||||
"@types/chai-as-promised": "8.0.0",
|
||||
"@types/diff": "5.2.2",
|
||||
"@types/mocha": "10.0.8",
|
||||
"@types/node": "20.16.5",
|
||||
"@types/semver": "7.5.8",
|
||||
"@types/sinon": "17.0.3",
|
||||
"@types/sinon-chai": "3.2.12",
|
||||
"@types/source-map-support": "0.5.10",
|
||||
"@types/teen_process": "2.0.4",
|
||||
"@types/ws": "8.5.12",
|
||||
"@types/yargs": "17.0.32",
|
||||
"@types/yargs": "17.0.33",
|
||||
"@typescript-eslint/eslint-plugin": "7.18.0",
|
||||
"@typescript-eslint/parser": "7.18.0",
|
||||
"asyncbox": "3.0.0",
|
||||
@@ -105,31 +105,31 @@
|
||||
"eslint": "8.57.0",
|
||||
"eslint-config-prettier": "9.1.0",
|
||||
"eslint-find-rules": "4.1.0",
|
||||
"eslint-import-resolver-typescript": "3.6.1",
|
||||
"eslint-plugin-import": "2.29.1",
|
||||
"eslint-import-resolver-typescript": "3.6.3",
|
||||
"eslint-plugin-import": "2.30.0",
|
||||
"eslint-plugin-mocha": "10.5.0",
|
||||
"eslint-plugin-promise": "6.6.0",
|
||||
"finalhandler": "1.2.0",
|
||||
"finalhandler": "1.3.1",
|
||||
"get-port": "5.1.1",
|
||||
"json-schema-to-typescript": "15.0.0",
|
||||
"lerna": "8.1.7",
|
||||
"json-schema-to-typescript": "15.0.2",
|
||||
"lerna": "8.1.8",
|
||||
"log-symbols": "4.1.0",
|
||||
"midnight-smoker": "8.0.0",
|
||||
"mjpeg-consumer": "2.0.0",
|
||||
"mjpeg-server": "0.3.1",
|
||||
"mocha": "10.7.0",
|
||||
"npm-run-all2": "6.2.2",
|
||||
"mocha": "10.7.3",
|
||||
"npm-run-all2": "6.2.3",
|
||||
"prettier": "3.3.3",
|
||||
"rewiremock": "3.14.5",
|
||||
"rimraf": "5.0.10",
|
||||
"serve-static": "1.15.0",
|
||||
"sinon": "18.0.0",
|
||||
"serve-static": "1.16.2",
|
||||
"sinon": "18.0.1",
|
||||
"sync-monorepo-packages": "1.0.2",
|
||||
"ts-node": "10.9.2",
|
||||
"tsd": "0.31.1",
|
||||
"tsd": "0.31.2",
|
||||
"typescript": "5.5.4",
|
||||
"validate.js": "0.13.1",
|
||||
"webdriverio": "8.40.0",
|
||||
"webdriverio": "8.40.5",
|
||||
"ws": "8.18.0",
|
||||
"yaml-js": "0.3.1"
|
||||
},
|
||||
|
||||
@@ -3,6 +3,28 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.11.4](https://github.com/appium/appium/compare/appium@2.11.3...appium@2.11.4) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **appium:** Fix the condition for secure websocket ([#20497](https://github.com/appium/appium/issues/20497)) ([efdb1ce](https://github.com/appium/appium/commit/efdb1ce6ce1de5120f2f35ebe84abfa73ed5198a))
|
||||
* **appium:** update dependency @sidvind/better-ajv-errors to v3 ([#20552](https://github.com/appium/appium/issues/20552)) ([0ee7716](https://github.com/appium/appium/commit/0ee7716cf0644cfc6795f0949d8253d4c0b36597))
|
||||
* **appium:** update dependency winston to v3.14.2 ([#20465](https://github.com/appium/appium/issues/20465)) ([893fc04](https://github.com/appium/appium/commit/893fc040e16ec07c83d12c7c89180d962b0f6e68))
|
||||
* **base-driver:** Add a server flag to check if it operates a secure protocol ([#20449](https://github.com/appium/appium/issues/20449)) ([622b245](https://github.com/appium/appium/commit/622b245ea38793280d9785a59a0416ce025862fe))
|
||||
* **docutils:** update dependency yaml to v2.5.1 ([750872a](https://github.com/appium/appium/commit/750872af4756d2efcd19fe98762f82ecaa59d59a))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.40.3 ([4608563](https://github.com/appium/appium/commit/46085635a92c3a2b2b1b3ecf3966a174248a2829))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.40.5 ([dcb6de2](https://github.com/appium/appium/commit/dcb6de22eaabdcea2517cd9b7db120d681f0e38e))
|
||||
* **support:** update dependency axios to v1.7.4 ([d17d022](https://github.com/appium/appium/commit/d17d0222245ab94a78e578c0398734e65a89ba68))
|
||||
* **support:** update dependency axios to v1.7.5 ([fedabb1](https://github.com/appium/appium/commit/fedabb1fdc7af10f9e4b06ea23815c4bc7c6bf5e))
|
||||
* **support:** update dependency axios to v1.7.7 ([7fe67a2](https://github.com/appium/appium/commit/7fe67a286a15a917ce3b1b47a08e982e65bbd9e4))
|
||||
* **types:** update dependency type-fest to v4 ([#20467](https://github.com/appium/appium/issues/20467)) ([482a1f7](https://github.com/appium/appium/commit/482a1f7bbfbf6478ee09bb1668b830ddbf13b143))
|
||||
* **types:** update dependency type-fest to v4 ([#20471](https://github.com/appium/appium/issues/20471)) ([9a66f48](https://github.com/appium/appium/commit/9a66f4800141cc86c90d58ca1103bab0066081bc))
|
||||
* **types:** update dependency type-fest to v4 ([#20548](https://github.com/appium/appium/issues/20548)) ([5b8cb76](https://github.com/appium/appium/commit/5b8cb76ea3cda75095e79c91539be73feeadf869))
|
||||
* **types:** update dependency type-fest to v4.26.0 ([#20511](https://github.com/appium/appium/issues/20511)) ([8f20c97](https://github.com/appium/appium/commit/8f20c973f4a6d3380163b6afd7f113808453a62d))
|
||||
|
||||
|
||||
|
||||
## [2.11.3](https://github.com/appium/appium/compare/appium@2.11.2...appium@2.11.3) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ property in your `package.json` and it will be automatically discovered.
|
||||
Appium will search _up_ the directory tree from the current working directory for one of these
|
||||
files. If it reaches the current user's home directory or filesystem root, it will stop looking.
|
||||
|
||||
To specify a _custom_ location for your config file, use `appium --config-file /path/to/config/file`.
|
||||
To specify a _custom_ location for your config file, use `appium --config /path/to/config/file`.
|
||||
|
||||
#### Configuration File Format
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ title: Welcome
|
||||
</style>
|
||||
|
||||
<div style="text-align:center;width:100%;background-color:#7f56c2" >
|
||||
<h3>
|
||||
Appium Conf 2024 is coming online, 13 September. Have you got something to share with the community? <a style="color:#fcba12" href="https://confengine.com/conferences/appium-conf-2024/proposals?utm_medium=referal&utm_source=appium.io&utm_campaign=launch" target="blank">Submit a proposal</a>
|
||||
<h3 style="color:#ffffff;">
|
||||
Appium Conf 2024 is coming online, 13 September. Improve your Appium skills and connect with the community. <br><a style="color:#fcba12" href="https://confengine.com/conferences/appium-conf-2024/register/selection?utm_medium=referal&utm_source=appium.io&utm_campaign=register" target="blank">Register Now</a>
|
||||
</h3>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
|
||||
@@ -47,109 +47,52 @@ async setUrl(url) {
|
||||
|
||||
## 自动化映射
|
||||
|
||||
But *typically* what driver authors want to do is to provide automation behaviours for a given
|
||||
platform(s) that are semantically very similar to the the WebDriver spec implementations for
|
||||
browsers. When you want to find an element, you should get a reference to a UI element. When you
|
||||
want to click or tap that element, the resulting behaviour should be the same as if a person were
|
||||
to click or tap on the element. And so on.
|
||||
但通常驱动程序作者想要做的是为给定的平台提供自动化行为,这些行为在语义上与浏览器的WebDriver规范实现非常相似。当你想找到一个元素时,您应该得到一个对UI元素的引用。当您想要点击或轻触那个元素时,其产生的行为应该与一个人点击或轻触该元素时的行为相同。以此类推。
|
||||
|
||||
So the real challenge for driver authors is not how to work with the WebDriver protocol (because
|
||||
`BaseDriver` encapsulates all that for you), but how to make the actual automation happen on the
|
||||
target platform. Every driver relies on its own set of underlying technologies here. As mentioned
|
||||
in the [Overview](index.md), the iOS driver uses an Apple technology called
|
||||
[XCUITest](https://developer.apple.com/documentation/xctest/xcuielement). These underlying
|
||||
automation technologies usually have proprietary or idiosyncratic APIs of their own. Writing
|
||||
a driver becomes the task of mapping the WebDriver protocol to this underlying API (or sometimes
|
||||
a set of different underlying APIs--for example, the UiAutomator2 driver relies not only on the
|
||||
[UiAutomator2](https://developer.android.com/training/testing/other-components/ui-automator)
|
||||
technology from Google, but also functions only available through
|
||||
[ADB](https://developer.android.com/tools/adb), as well as functions only available
|
||||
via the Android SDK inside a helper app). Tying it all together into a single, usable, WebDriver
|
||||
interface is the incredibly useful (but incredibly challenging) art of driver development!
|
||||
因此,驱动程序作者面临的真正挑战不是如何使用WebDriver协议(因为`BaseDriver`已经为您封装了所有),而是如何在目标平台上实现实际的自动化。每个驱动程序都依赖于自己的一套底层技术。正如[概述](index.md)中提到的,iOS驱动程序使用了一种名为[XCUITest](https://developer.apple.com/documentation/xctest/xcuielement)的苹果技术。这些底层自动化技术通常具有自己的专有或特殊API。编写驱动程序变成了将WebDriver协议映射到该底层API的任务(或者有时是一组不同的底层API,例如UiAutomator 2驱动程序不仅依赖于Google的[UiAutomator 2](https://developer.android.com/training/testing/other-components/ui-automator)技术,而且还具有仅通过[ADB](https://developer.android.com/tools/adb)提供的功能,以及仅通过Android SDK在助手应用程序中提供的功能)。将所有内容整合到一个可用的WebDriver界面中,是驱动程序开发中非常有用(但极具挑战性)的艺术!
|
||||
|
||||
## 多层架构
|
||||
|
||||
In practice, this often results in a pretty complex architecture. Let's take iOS for example again.
|
||||
The XCUITest framework (the one used by the Appium driver) expects code that calls it to be written
|
||||
in Objective-C or Swift. Furthermore, XCUITest code can only be run in a special mode triggered by
|
||||
Xcode (and directly or indirectly, the Xcode command line tools). In other words, there's no
|
||||
straightforward way to go from a Node.js function implementation (like `setUrl()` above) to
|
||||
XCUITest API calls.
|
||||
在实践中,这通常会导致相当复杂的架构。让我们再次以iOS为例,XCUITest框架(Appium驱动程序使用的那个)期望调用它的代码是用Objective-C或Swift编写的。此外,XCUITest代码只能在Xcode(以及直接或间接的Xcode命令行工具)触发的特殊模式下运行。换句话说,没有简单的方法可以从Node.js函数实现(例如上面的`setUrl()`)到XCUITest API调用。
|
||||
|
||||
What the XCUITest driver authors have done is instead to split the driver into two parts: one part
|
||||
written in Node.js (the part which is incorporated into Appium and which initially handles the
|
||||
WebDriver commands), and the other part written in Objective-C (the part which actually gets run on
|
||||
an iOS device and makes XCUITest API calls). This makes interfacing with XCUITest possible, but
|
||||
introduces the new problem of coordination between the two parts.
|
||||
XCUITest驱动程序的作者所做的是将驱动程序分为两部分:一部分用Node.js编写(这部分被合并到Appium中,用于处理WebDriver命令),另一部分用Objective-C编写(这一部分实际上在iOS设备上运行,并进行XCUITest API调用)。这使得实现与XCUITest交互的接口成为可能,但引入了两个部分之间协调的新问题。
|
||||
|
||||
The driver authors could have chosen any of a number of very different strategies to model the
|
||||
communication between the Node.js side and the Objective-C side, but at the end of the day decided
|
||||
to use ... the WebDriver protocol! That's right, the Objective-C side of the XCUITest driver is
|
||||
itself a WebDriver implementation, called
|
||||
[WebDriverAgent](https://github.com/appium/webdriveragent).[^3]
|
||||
驱动程序作者可以选择许多非常不同的策略中的任何一种来模拟Node.js端和Objective-C端之间的通信,但最终决定使用WebDriver协议!没错,XCUITest驱动程序的Objective-C端本身就是一个WebDriver实现,称为[WebDriverAgent](https://github.com/appium/webdriveragent).[^3]。
|
||||
|
||||
[^3]: You could in theory, therefore, point your WebDriver client straight to WebDriverAgent and
|
||||
bypass Appium entirely. This is usually not convenient, however, for a few reasons:
|
||||
[^3]: 因此,从理论上讲,您可以将WebDriver客户端直接指向WebDriverAgent并完全绕过Appium。然而,这通常不方便,原因有几个:
|
||||
|
||||
- The Appium XCUITest driver builds and manages WebDriverAgent for you, which can be a pain and
|
||||
involves the use of Xcode.
|
||||
- The XCUITest driver does lots more than what can be done by WebDriverAgent, for example working
|
||||
with simulators or devices, installing apps, and the like.
|
||||
- Appium的XCUITest驱动程序为您构建和管理WebDriverAgent,这可能是个麻烦事,并且涉及到使用Xcode。
|
||||
|
||||
The moral of the story is that driver architectures can become quite complicated and multilayered,
|
||||
due to the nature of the problem we're trying to solve. It also means it can be difficult sometimes
|
||||
to tell where in this chain of technologies something has gone wrong, if you run into a problem
|
||||
with a particular test. With the XCUITest world again, we have something like the following set of
|
||||
technologies all in play at the same time:
|
||||
- XCUITest驱动程序的功能比WebDriverAgent要多得多,例如使用模拟器或设备、安装应用程序等。
|
||||
|
||||
- Your test code (in its programming language) - owned by you
|
||||
- The Appium client library - owned by Appium
|
||||
- The Selenium client library - owned by Selenium
|
||||
- The network (local or Internet)
|
||||
- The Appium server - owned by Appium
|
||||
- The Appium XCUITest driver - owned by Appium
|
||||
- WebDriverAgent - owned by Appium
|
||||
- Xcode - owned by Apple
|
||||
- XCUITest - owned by Apple
|
||||
- iOS itself - owned by Apple
|
||||
- macOS (where Xcode and iOS simulators run) - owned by Apple
|
||||
这个故事的寓意是,由于我们试图解决的问题的性质,驱动程序架构可能会变得非常复杂和多层次。这也意味着,如果你在特定的测试中遇到问题,有时很难判断这一技术链中哪里出了问题。在XCUITest世界中,我们有以下几项技术同时发挥作用:
|
||||
|
||||
It's a pretty deep stack!
|
||||
- 您的测试代码(使用相应的编程语言) - 由您拥有
|
||||
- Appium客户端库 - 由Appium拥有
|
||||
- Selenium客户端库 - 由Selenium拥有
|
||||
- 网络(本地或Internet)
|
||||
- Appium服务器 - 由Appium拥有
|
||||
- Appium XCUITest驱动程序 - 由Appium拥有
|
||||
- WebDriverAgent - 由Appium拥有
|
||||
- Xcode - 由Apple拥有
|
||||
- XCUITest - 由Apple拥有
|
||||
- iOS本身 - 由Apple拥有
|
||||
- macOS(运行Xcode和iOS模拟器的地方)- 由Apple拥有
|
||||
|
||||
这是一个相当深的堆栈!
|
||||
|
||||
## 代理模式
|
||||
|
||||
There's one other important architectural aspect of drivers to understand. It can be exemplified
|
||||
again by the XCUITest driver. Recall that we just discussed how the two "halves" of the XCUITest
|
||||
driver both speak the WebDriver protocol---the Node.js half clicks right into Appium's WebDriver
|
||||
server, and the Objective-c half (WebDriverAgent) is its own WebDriver implementation.
|
||||
驱动程序还有另一个重要的架构方面需要理解。XCUITest驱动程序再次证明了这一点。回想一下,我们刚刚讨论了XCUITest驱动程序的两个“部分”是如何使用WebDriver协议的,Node.js部分直接点击Appium的WebDriver服务器,而Objective-c部分(WebDriverAgent)是它自己的WebDriver实现。
|
||||
|
||||
This opens up the possibility of Appium taking a shortcut in certain cases. Let's imagine that the
|
||||
XCUITest driver needs to implement the `Click Element` command. The internal code of this
|
||||
implementation would look something like taking the appropriate parameters and constructing an HTTP
|
||||
request to the WebDriverAgent server. In this case, we're basically just reconstructing the
|
||||
client's original call to the Appium server![^4] So there's really no need to even write a function
|
||||
implementing the `Click Element` command. Instead, the XCUITest driver can just let Appium know
|
||||
that this command should be proxied directly to some other WebDriver server.
|
||||
这为Appium在某些情况下走捷径提供了可能性。假设XCUITest驱动程序需要实现`Click Element`命令。此实现的内部代码看起来类似于获取适当的参数并构造对WebDriverAgent服务器的HTTP请求。在这种情况下,我们基本上只是在重建客户端对Appium服务器的原始调用![^4] 所以实际上没有必要编写一个函数来实现`Click Element`命令,XCUITest驱动程序可以让Appium知道这个命令应该代理到其他一些WebDriver服务器。
|
||||
|
||||
[^4]: It's not *exactly* the same call, because the Appium server and the WebDriverAgent server
|
||||
will generate different session IDs, but these differences will be handled transparently.
|
||||
[^4]: 这不是完全相同的调用,因为Appium服务器和WebDriver Agent服务器将生成不同的会话ID,但这些差异将被透明地处理。
|
||||
|
||||
If you're not familiar with the concept of "proxying," in this case it just means that the XCUITest
|
||||
driver will not be involved at all in handling the command. Instead it will merely be repackaged
|
||||
and forwarded to WebDriverAgent at the protocol level, and WebDriverAgent's response will likewise
|
||||
be passed back directly to the client, without any XCUITest driver code seeing it or modifying it.
|
||||
如果你不熟悉"代理"这个概念,在这种情况下,它只是意味着XCUITest驱动程序将不参与处理命令。相反,它将仅仅被重新打包并转发到协议层的WebDriverAgent,并且WebDriverAgent的响应也将直接传回给客户端,而无需XCUITest驱动程序代码查看它或修改它。
|
||||
|
||||
This architectural pattern provides a nice bonus for driver authors who choose to deal with the
|
||||
WebDriver protocol everywhere, rather than constructing bespoke protocols. It also means that
|
||||
Appium can create wrapper drivers for any other existing WebDriver implementation very easily. If
|
||||
you look at the [Appium Safari driver](https://github.com/appium/appium-safari-driver) code, for
|
||||
example, you'll see that it implements basically no standard commands, because all of these are
|
||||
proxied directly to an underlying SafariDriver process.
|
||||
这种架构模式为驱动程序开发者提供了一个好处,使他们可以选择完全使用WebDriver协议,而不需要构建特定的协议。这也意味着Appium可以非常容易地为任何现有的WebDriver实现创建封装驱动程序。例如,如果你查看[Appium的Safari驱动程序](https://github.com/appium/appium-safari-driver)代码,你会发现它基本上没有实现任何标准命令,因为所有这些命令都直接代理到一个底层的SafariDriver进程。
|
||||
|
||||
It's important to understand that this proxying business is sometimes happening under the hood,
|
||||
because if you're ever diving into some open source driver code trying to figure out where
|
||||
a command is implemented, you might be surprised to find no implementation at all in the Node.js
|
||||
driver code itself! In that case, you'll need to figure out where commands are being proxied to so
|
||||
you can look there for the appropriate implementation.
|
||||
理解这种代理机制在幕后运行有时非常重要,因为如果你深入研究一些开源驱动程序代码,试图找出命令是在哪里实现的,你可能会惊讶地发现Node.js驱动程序代码中根本没有任何实现!在这种情况下,你需要弄清楚命令被代理到哪里,以便在那里查找相应的实现。
|
||||
|
||||
OK, that's enough for this very detailed introduction to drivers!
|
||||
好了,这就是关于驱动程序的详细介绍的全部内容!
|
||||
|
||||
@@ -1,6 +1,109 @@
|
||||
---
|
||||
title: Appium 项目历史
|
||||
title: Appium项目历史
|
||||
---
|
||||
|
||||
自2012年以来,Appium一直以某种形式存在。它受到各种个人和组织的指导,甚至以3种不同的编程语言实现!
|
||||
欢迎了解比您想了解的更多关于Appium是如何成为今天的样子的..
|
||||
|
||||
TODO
|
||||
## 早期灵感
|
||||
|
||||
[Dan Cuellar](https://twitter.com/thedancuellar)于2011年担任Zoosk的测试经理,当时他遇到了一个问题,iOS产品的测试通过时间已经失控。
|
||||
减少测试是一种选择,但会带来额外的风险,特别是需要几天时间才能通过iOS App Store审查流程获得补丁。
|
||||
他回想起自己在网站上工作的日子,意识到自动化就是答案。
|
||||
|
||||
Dan对现有的工具进行了调查,结果发现它们都存在重大缺陷。苹果公司提供的UIAutomation工具要求测试用JavaScript编写,不允许实时调试或解释。
|
||||
它还必须在Xcode分析工具Instruments中执行。其他第三方工具使用私有API,并要求将SDK和HTTP服务器嵌入到应用程序中。这似乎非常不可取。
|
||||
|
||||
Dan对现有的选择不满意,他要求经理再给他一些时间,看看他是否能找到更好的方法。
|
||||
他花了两周时间四处探索,看看是否有办法使用经过批准的苹果技术来自动化iOS应用程序。
|
||||
他尝试的第一个实现是使用AppleScript通过OS X可访问性API向Mac UI元素发送消息。
|
||||
这在一定程度上奏效了,但永远不会在真实设备上奏效,更不用说其他缺点了。
|
||||
|
||||
所以他想,如果我能让UIAutomation框架像解释器一样实时运行呢?他对此进行了研究,并确定他需要做的就是找到一种方法,
|
||||
从UIAutomation javascript程序中接收、执行和回复命令。使用苹果提供的用于执行shell命令的实用程序,他能够按顺序扫描文本文件以接收命令,
|
||||
`eval()`输出以执行命令,并用python将它们写回磁盘。然后,他用C#编写了实现Selenium风格语法的代码,以编写顺序排列的javascript命令。
|
||||
iOSAuto诞生了。
|
||||
|
||||
## 2012年Selenium会议
|
||||
|
||||
Dan被选中在2012年伦敦的Selenium大会上演讲,讨论一个完全不同的话题。
|
||||
在他的演讲中,他展示了如何使用Selenium语法进行iOS自动化,演示了编写平台无关的测试,同时使用具有共同接口的不同平台特定页面对象。
|
||||
令他惊讶的是,这种酷炫的测试架构却被iOS测试像WebDriver测试一样运行的场面掩盖了。
|
||||
几个人建议他在会议后再做一个闪电演讲,详细解释一下这个工作原理。
|
||||
|
||||
在会议的第二天,Dan登上舞台进行闪电演讲。Selenium的共同创始人Jason Huggins主持了闪电演讲。
|
||||
Dan在加载演示文稿时遇到了技术问题,Jason差点转到下一个闪电演讲。就在最后一刻,屏幕打开了,Dan迅速进入了他的演讲。
|
||||
他详细解释了他的实现细节和工作原理,恳求贡献者,并在五分钟内结束了演讲。观众礼貌地鼓掌,他离开了舞台。
|
||||
|
||||
## 电话响了
|
||||
|
||||
在Selenium大会四个月后,Jason给Dan打了电话。Jason一直在为Sauce Labs的一位客户提供iOS测试支持。
|
||||
Jason记得Dan的闪电演讲,认为这个项目可能对Jason的工作有帮助,但Dan的源代码并没有公开。
|
||||
于是Jason邀请Dan见一面。那一周的晚些时候,Dan在旧金山的一家酒吧遇到了Jason,并向他展示了iOSAuto的源代码。
|
||||
|
||||
Jason是一位长期的开源倡导者,他鼓励Dan在开源许可证下发布他的代码。
|
||||
8月,Dan在GitHub上发布了C#版本的[源代码](https://github.com/penguinho/appium-old/commit/3ab56d3a5601897b2790b5256351f9b5af3f9e90)。
|
||||
Jason鼓励Dan改变开发语言,使该项目对潜在贡献者更具吸引力。
|
||||
Dan上传了基于Python实现的[新版本](https://github.com/penguinho/appium-old/commit/9b891207be0957bf209a77242750da17d3eb8eda)。
|
||||
9月,Jason添加了一个Web服务器,并开始通过HTTP实现[WebDriver有线协议](https://github.com/hugs/appium-old/commit/ae8fe4578640d9af9137d0546190fa29317d1499),
|
||||
使iOSAuto可以从任何语言的任何Selenium WebDriver客户端库编写脚本。
|
||||
|
||||
## 移动测试峰会
|
||||
|
||||
Jason决定在11月的[移动测试峰会](https://twitter.com/mobtestsummit)上展示该项目,但建议先给该项目取一个新名字。
|
||||
许多想法被抛弃了,他们最终选择了AppleCart。一天后,当Jason在浏览苹果公司关于版权和商标的一些指导时,他注意到,
|
||||
在苹果公司会捍卫其商标的名称示例部分,第一个例子是“AppleCart”。
|
||||
他打电话给Dan,告知了这一情况,然后他们一起头脑风暴了一会儿,接着Jason突然想到了一个绝妙的主意。Appium... Selenium for Apps。
|
||||
|
||||
## Sauce Labs和Node.js
|
||||
|
||||
2013年1月,在移动测试峰会后不久,Sauce Labs决定全力支持Appium,并提供更多的开发能力,
|
||||
他们成立了一个工作小组,评估了项目的当前状态以及如何更好地推进项目。
|
||||
包括Jonathan Lipps(现任项目负责人)在内的团队认为Appium需要重生,并决定使用Node.js作为框架。
|
||||
Node.js是众所周知的快速高效的web服务器后端,而归根结底,Appium只是一个高度专业化的web服务器。
|
||||
同时JavaScript是一种非常容易使用的编程语言,这能让Appium比桌面上的其他选项,更容易地吸引更多开发者加入社区。
|
||||
|
||||
短短几天内,团队基于Appium的现有功能,开发了一个新版本的Appium,他的功能与之前的Python版本一样多。
|
||||
这为Appium的基本架构奠定了基础,此后我们一直在此基础上成功地进行建设。
|
||||
冲刺开发几周后,Jonathan Lipps被正式指定为项目负责人,他开始制定战略,如何让更多的人参与Appium的开发。
|
||||
|
||||
## Appium环游世界
|
||||
|
||||
最终Jonathan决定,让Appium在会议和聚会上,尽可能多的在开发人员面前展示,是吸引用户和贡献的最佳方式。
|
||||
Appium在[2013年谷歌测试自动化大会](https://www.youtube.com/watch?v=1J0aXDbjiUE)上首次亮相。
|
||||
2013年晚些时候,Appium在美国各地以及英国、波兰、葡萄牙和澳大利亚的会议和聚会上亮相。
|
||||
值得注意的是,Jonathan让Appium[像乐队中的乐器一样进行表演](https://www.youtube.com/watch?v=zsbNVkayYRQ),
|
||||
而Dan Cuellar为Selenium大会制作了一个有趣的[Appium视频混剪](https://www.youtube.com/watch?v=xkzrEn0v0II)。
|
||||
|
||||
在所有这些演讲和会议中,项目仍在继续发展。2013年初,我们发布了对Android和Selendroid的支持,使Appium成为第一个真正的跨平台自动化框架。
|
||||
该项目也继续吸引用户和贡献者,到2013年底,我们已经有1000多个提交。
|
||||
|
||||
## 通往Appium 1.0之路
|
||||
|
||||
Appium开始显著生长和成熟。2014年5月,我们发布了Appium 1.0,这是Appium发展的一个里程碑。Appium获得了
|
||||
[各种](http://sauceio.com/index.php/2014/01/appium-selected-as-a-black-duck-open-source-rookie-of-the-year/)
|
||||
[奖项](http://sauceio.com/index.php/2014/10/appium-wins-a-bossy-award-from-infoworld/),
|
||||
成为最受欢迎的开源跨平台移动自动化框架。稳定性得到改善,错误得到优先处理和修复,并添加了新的功能。
|
||||
Sauce Labs增加了捐赠给Appium开发人员的数量,但整个社区都参与了项目的指导和贡献,
|
||||
项目治理继续在公开的公共邮件列表和GitHub的问题跟踪器上进行。
|
||||
|
||||
## Appium的生态圈在扩大
|
||||
|
||||
很明显Appium的代码库,并没有为一个由分散的、不定时贡献者组成的大型团队进行优化。我们作为提交者抓住了这个机会,从头开始重写Appium,
|
||||
使用更现代的JavaScript语言版本,并重新设计了Appium的架构,以便用户或第三方开发者能够轻松构建他们自己的Appium驱动程序。
|
||||
我们希望新的贡献者能够更容易地熟悉Appium的代码库,并看到,除了核心团队之外,还有其他团体为Appium增加对新平台的支持。
|
||||
这一愿景已经开始实现,像微软和Youi.tv这样的团队,分别为Windows桌面应用自动化和Youi.tv应用自动化增加了驱动程序。
|
||||
谁知道接下来会添加哪些平台呢?
|
||||
|
||||
## Appium走向大众
|
||||
|
||||
在2016年末,Sauce Labs将Appium作为一个项目捐赠给了[JS Foundation](https://js.foundation),
|
||||
以此来向世界证明Sauce致力于保持Appium的开源状态。JS Foundation是一个非营利性的开源管理组织,负责持有开源项目的版权,并确保它们在社区中能够长期地发展。
|
||||
随着我们转移到这个非营利性基金会,我们希望对新的参与者能够更加敞开大门,无论是作为个人还是作为对Appium发展感兴趣的众多公司之一。
|
||||
|
||||
最终,JS Foundation合并到了[OpenJS Foundation](https://openjsf.org)中,而Appium是该基金会的一个有影响力的项目。
|
||||
|
||||
## Appium 2.0
|
||||
|
||||
Appium 2于2023年发布,它将重点放在将Appium作为一个生态系统而不是单一的项目上。任何人都可以开发和共享驱动程序和插件,
|
||||
这为实现iOS和Android之外的平台自动化开发,开辟了无限的可能性。
|
||||
|
||||
@@ -773,8 +773,7 @@ class AppiumDriver extends DriverCore {
|
||||
// information here!
|
||||
if (dCaps.webSocketUrl && driverInstance.doesSupportBidi) {
|
||||
const {address, port, basePath} = this.args;
|
||||
const isUsingSsl = this.args.sslCertificatePath && this.args.sslKeyPath;
|
||||
const scheme = isUsingSsl ? 'wss' : 'ws';
|
||||
const scheme = `ws${this.server.isSecure() ? 's' : ''}`;
|
||||
const bidiUrl = `${scheme}://${address}:${port}${basePath}${BIDI_BASE_PATH}/${innerSessionId}`;
|
||||
// @ts-ignore webSocketUrl gets sent by the client as a boolean, but then it is supposed
|
||||
// to come back from the server as a string. TODO figure out how to express this in our
|
||||
|
||||
@@ -344,7 +344,7 @@ function formatTimestamp(args) {
|
||||
* @param {string} text
|
||||
* @returns {string}
|
||||
*/
|
||||
function stripColorCodes(text) {
|
||||
export function stripColorCodes(text) {
|
||||
return text.replace(COLOR_CODE_PATTERN, '');
|
||||
}
|
||||
|
||||
|
||||
@@ -447,7 +447,7 @@ async function main(args) {
|
||||
});
|
||||
}
|
||||
|
||||
const protocol = 'secure' in server && server.secure ? 'https' : 'http';
|
||||
const protocol = server.isSecure() ? 'https' : 'http';
|
||||
const address = net.isIPv6(parsedArgs.address) ? `[${parsedArgs.address}]` : parsedArgs.address;
|
||||
logServerAddress(
|
||||
`${protocol}://${address}:${parsedArgs.port}${normalizeBasePath(parsedArgs.basePath)}`,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "appium",
|
||||
"version": "2.11.3",
|
||||
"version": "2.11.4",
|
||||
"description": "Automation for Apps.",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -59,14 +59,14 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-driver": "^9.11.3",
|
||||
"@appium/base-plugin": "^2.2.43",
|
||||
"@appium/docutils": "^1.0.19",
|
||||
"@appium/base-driver": "^9.11.4",
|
||||
"@appium/base-plugin": "^2.2.44",
|
||||
"@appium/docutils": "^1.0.20",
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/schema": "^0.6.1",
|
||||
"@appium/support": "^5.1.3",
|
||||
"@appium/types": "^0.21.2",
|
||||
"@sidvind/better-ajv-errors": "2.1.3",
|
||||
"@appium/support": "^5.1.4",
|
||||
"@appium/types": "^0.21.3",
|
||||
"@sidvind/better-ajv-errors": "3.0.1",
|
||||
"@types/argparse": "2.0.16",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/semver": "7.5.8",
|
||||
@@ -77,7 +77,7 @@
|
||||
"argparse": "2.0.1",
|
||||
"async-lock": "1.4.1",
|
||||
"asyncbox": "3.0.0",
|
||||
"axios": "1.7.3",
|
||||
"axios": "1.7.7",
|
||||
"bluebird": "3.7.2",
|
||||
"cross-env": "7.0.3",
|
||||
"lilconfig": "3.1.2",
|
||||
@@ -89,11 +89,11 @@
|
||||
"semver": "7.6.3",
|
||||
"source-map-support": "0.5.21",
|
||||
"teen_process": "2.2.0",
|
||||
"type-fest": "4.23.0",
|
||||
"winston": "3.13.1",
|
||||
"type-fest": "4.26.1",
|
||||
"winston": "3.14.2",
|
||||
"wrap-ansi": "7.0.0",
|
||||
"ws": "8.18.0",
|
||||
"yaml": "2.5.0"
|
||||
"yaml": "2.5.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"devDependencies": {
|
||||
"webdriverio": "8.40.0"
|
||||
"webdriverio": "8.40.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
EXECUTABLE,
|
||||
runAppiumRaw,
|
||||
} from './e2e-helpers';
|
||||
import { stripColorCodes } from '../../lib/logsink';
|
||||
|
||||
describe('argument parsing', function () {
|
||||
/**
|
||||
@@ -68,23 +69,17 @@ describe('argument parsing', function () {
|
||||
describe('when the user provides an string where a number was expected', function () {
|
||||
describe('when color output is supported', function () {
|
||||
it('should output a fancy error message', async function () {
|
||||
const [{stderr: actual}, expected] = await B.all([
|
||||
runAppiumRaw(appiumHome, ['--port=sheep'], {
|
||||
env: {FORCE_COLOR: '1'},
|
||||
}),
|
||||
readAppiumArgErrorFixture('cli/cli-error-output-color.txt'),
|
||||
]);
|
||||
expect(formatAppiumArgErrorOutput(actual)).to.equal(expected);
|
||||
const {stderr: actual} = await runAppiumRaw(appiumHome, ['--port=sheep'], {
|
||||
env: {FORCE_COLOR: '1'},
|
||||
});
|
||||
expect(stripColorCodes(actual)).to.not.equal(actual);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when color output is unsupported', function () {
|
||||
it('should output a colorless yet fancy error message', async function () {
|
||||
const [{stderr: actual}, expected] = await B.all([
|
||||
runAppiumRaw(appiumHome, ['--port=sheep'], {}),
|
||||
readAppiumArgErrorFixture('cli/cli-error-output.txt'),
|
||||
]);
|
||||
expect(formatAppiumArgErrorOutput(actual)).to.equal(expected);
|
||||
const {stderr: actual} = await runAppiumRaw(appiumHome, ['--port=sheep'], {});
|
||||
expect(stripColorCodes(actual)).to.equal(actual);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
[0m[31m[1m>[22m[39m[90m 1 |[39m [32m"sheep"[39m[0m
|
||||
[0m [90m |[39m [31m[1m^[22m[39m[31m[1m^[22m[39m[31m[1m^[22m[39m[31m[1m^[22m[39m[31m[1m^[22m[39m[31m[1m^[22m[39m[31m[1m^[22m[39m [31m[1m👈🏽 [95mtype[31m must be integer[22m[39m[0m
|
||||
@@ -1,2 +0,0 @@
|
||||
> 1 | "sheep"
|
||||
| ^^^^^^^ 👈🏽 type must be integer
|
||||
@@ -3,6 +3,27 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [9.11.4](https://github.com/appium/appium/compare/@appium/base-driver@9.11.3...@appium/base-driver@9.11.4) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **base-driver:** Add a server flag to check if it operates a secure protocol ([#20449](https://github.com/appium/appium/issues/20449)) ([622b245](https://github.com/appium/appium/commit/622b245ea38793280d9785a59a0416ce025862fe))
|
||||
* **base-driver:** update dependency body-parser to v1.20.3 ([056baba](https://github.com/appium/appium/commit/056baba3a0c51973d5e834283355821eced6ee17))
|
||||
* **base-driver:** update dependency express to v4.20.0 ([ef163eb](https://github.com/appium/appium/commit/ef163eb8df512e89f4e62c99b32fc979008fcfaa))
|
||||
* **base-driver:** update dependency express to v4.21.0 ([cb9fb9c](https://github.com/appium/appium/commit/cb9fb9c6fef608e29284210be27356a488f4002c))
|
||||
* **base-driver:** update dependency path-to-regexp to v8 ([#20520](https://github.com/appium/appium/issues/20520)) ([63cb664](https://github.com/appium/appium/commit/63cb664af13d7411ff325095cd0e9b6fd24363c3))
|
||||
* **base-driver:** update dependency path-to-regexp to v8.1.0 ([#20562](https://github.com/appium/appium/issues/20562)) ([1cae549](https://github.com/appium/appium/commit/1cae549a7be5138e980af6661b96cd7d6268fdb0))
|
||||
* **support:** update dependency axios to v1.7.4 ([d17d022](https://github.com/appium/appium/commit/d17d0222245ab94a78e578c0398734e65a89ba68))
|
||||
* **support:** update dependency axios to v1.7.5 ([fedabb1](https://github.com/appium/appium/commit/fedabb1fdc7af10f9e4b06ea23815c4bc7c6bf5e))
|
||||
* **support:** update dependency axios to v1.7.7 ([7fe67a2](https://github.com/appium/appium/commit/7fe67a286a15a917ce3b1b47a08e982e65bbd9e4))
|
||||
* **types:** update dependency type-fest to v4 ([#20467](https://github.com/appium/appium/issues/20467)) ([482a1f7](https://github.com/appium/appium/commit/482a1f7bbfbf6478ee09bb1668b830ddbf13b143))
|
||||
* **types:** update dependency type-fest to v4 ([#20471](https://github.com/appium/appium/issues/20471)) ([9a66f48](https://github.com/appium/appium/commit/9a66f4800141cc86c90d58ca1103bab0066081bc))
|
||||
* **types:** update dependency type-fest to v4 ([#20548](https://github.com/appium/appium/issues/20548)) ([5b8cb76](https://github.com/appium/appium/commit/5b8cb76ea3cda75095e79c91539be73feeadf869))
|
||||
* **types:** update dependency type-fest to v4.26.0 ([#20511](https://github.com/appium/appium/issues/20511)) ([8f20c97](https://github.com/appium/appium/commit/8f20c973f4a6d3380163b6afd7f113808453a62d))
|
||||
|
||||
|
||||
|
||||
## [9.11.3](https://github.com/appium/appium/compare/@appium/base-driver@9.11.2...@appium/base-driver@9.11.3) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -144,8 +144,19 @@ export class BaseDriver<
|
||||
}
|
||||
};
|
||||
|
||||
const synchronizationKey = BaseDriver.name;
|
||||
// eslint-disable-next-line dot-notation
|
||||
const commandsQueueLen: number = this.commandsQueueGuard['queues']?.[synchronizationKey]?.length ?? 0;
|
||||
if (this.isCommandsQueueEnabled && commandsQueueLen > 0) {
|
||||
this.log.debug(
|
||||
`Scheduling the '${cmd}' command to the ${this.constructor.name} commands queue. ` +
|
||||
`${util.pluralize('queue item', commandsQueueLen, true)} ${commandsQueueLen === 1 ? 'is' : 'are'} ` +
|
||||
`already waiting for execution.`
|
||||
);
|
||||
}
|
||||
|
||||
const res = this.isCommandsQueueEnabled
|
||||
? await this.commandsQueueGuard.acquire(BaseDriver.name, runCommandPromise)
|
||||
? await this.commandsQueueGuard.acquire(synchronizationKey, runCommandPromise)
|
||||
: await runCommandPromise();
|
||||
|
||||
// log timing information about this command
|
||||
|
||||
@@ -2,7 +2,7 @@ import _ from 'lodash';
|
||||
import log from './logger';
|
||||
import {errors} from '../protocol';
|
||||
export {handleIdempotency} from './idempotency';
|
||||
import {pathToRegexp} from 'path-to-regexp';
|
||||
import {match} from 'path-to-regexp';
|
||||
import {util} from '@appium/support';
|
||||
import {calcSignature} from '../helpers/session';
|
||||
|
||||
@@ -119,7 +119,7 @@ export function handleUpgrade(webSocketsMapping) {
|
||||
currentPathname = req.url ?? '';
|
||||
}
|
||||
for (const [pathname, wsServer] of _.toPairs(webSocketsMapping)) {
|
||||
if (pathToRegexp(pathname).test(currentPathname)) {
|
||||
if (match(pathname)(currentPathname)) {
|
||||
return wsServer.handleUpgrade(req, req.socket, Buffer.from(''), (ws) => {
|
||||
wsServer.emit('connection', ws, req);
|
||||
});
|
||||
|
||||
@@ -201,6 +201,10 @@ function configureHttp({httpServer, reject, keepAliveTimeout}) {
|
||||
appiumServer.removeWebSocketHandler = removeWebSocketHandler;
|
||||
appiumServer.removeAllWebSocketHandlers = removeAllWebSocketHandlers;
|
||||
appiumServer.getWebSocketHandlers = getWebSocketHandlers;
|
||||
appiumServer.isSecure = function isSecure() {
|
||||
// eslint-disable-next-line dot-notation
|
||||
return Boolean(this['_spdyState']?.secure);
|
||||
};
|
||||
|
||||
// http.Server.close() only stops new connections, but we need to wait until
|
||||
// all connections are closed and the `close` event is emitted
|
||||
|
||||
@@ -18,7 +18,6 @@ import https from 'https';
|
||||
|
||||
const DEFAULT_LOG = logger.getLogger('WD Proxy');
|
||||
const DEFAULT_REQUEST_TIMEOUT = 240000;
|
||||
const COMPACT_ERROR_PATTERNS = [/\bECONNREFUSED\b/, /socket hang up/];
|
||||
|
||||
const {MJSONWP, W3C} = PROTOCOLS;
|
||||
|
||||
@@ -271,11 +270,7 @@ class JWProxy {
|
||||
}
|
||||
} else {
|
||||
proxyErrorMsg = `Could not proxy command to the remote server. Original error: ${e.message}`;
|
||||
if (COMPACT_ERROR_PATTERNS.some((p) => p.test(e.message))) {
|
||||
this.log.info(e.message);
|
||||
} else {
|
||||
this.log.info(e.stack);
|
||||
}
|
||||
this.log.info(e.message);
|
||||
}
|
||||
throw new errors.ProxyRequestError(proxyErrorMsg, e.response?.data, e.response?.status);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import _ from 'lodash';
|
||||
import {util} from '@appium/support';
|
||||
import {PROTOCOLS, DEFAULT_BASE_PATH} from '../constants';
|
||||
import {pathToRegexp} from 'path-to-regexp';
|
||||
import {match} from 'path-to-regexp';
|
||||
|
||||
const SET_ALERT_TEXT_PAYLOAD_PARAMS = {
|
||||
validate: (jsonObj) =>
|
||||
@@ -952,8 +952,8 @@ export function routeToCommandName(endpoint, method, basePath = DEFAULT_BASE_PAT
|
||||
possiblePathnames.push(normalizedPathname);
|
||||
const normalizedMethod = _.toUpper(method);
|
||||
for (const [routePath, routeSpec] of _.toPairs(METHOD_MAP)) {
|
||||
const routeRegexp = pathToRegexp(routePath);
|
||||
if (possiblePathnames.some((pp) => routeRegexp.test(pp))) {
|
||||
const routeMatcher = match(routePath);
|
||||
if (possiblePathnames.some((pp) => routeMatcher(pp))) {
|
||||
const commandName = routeSpec?.[normalizedMethod]?.command;
|
||||
if (commandName) {
|
||||
return commandName;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/base-driver",
|
||||
"version": "9.11.3",
|
||||
"version": "9.11.4",
|
||||
"description": "Base driver class for Appium drivers",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -44,8 +44,8 @@
|
||||
"test:types": "tsd"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^5.1.3",
|
||||
"@appium/types": "^0.21.2",
|
||||
"@appium/support": "^5.1.4",
|
||||
"@appium/types": "^0.21.3",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/async-lock": "1.4.2",
|
||||
"@types/bluebird": "3.5.42",
|
||||
@@ -55,19 +55,19 @@
|
||||
"@types/serve-favicon": "2.5.7",
|
||||
"async-lock": "1.4.1",
|
||||
"asyncbox": "3.0.0",
|
||||
"axios": "1.7.3",
|
||||
"axios": "1.7.7",
|
||||
"bluebird": "3.7.2",
|
||||
"body-parser": "1.20.2",
|
||||
"express": "4.19.2",
|
||||
"body-parser": "1.20.3",
|
||||
"express": "4.21.0",
|
||||
"http-status-codes": "2.3.0",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "10.4.3",
|
||||
"method-override": "3.0.0",
|
||||
"morgan": "1.10.0",
|
||||
"path-to-regexp": "7.1.0",
|
||||
"path-to-regexp": "8.1.0",
|
||||
"serve-favicon": "2.5.0",
|
||||
"source-map-support": "0.5.21",
|
||||
"type-fest": "4.23.0",
|
||||
"type-fest": "4.26.1",
|
||||
"validate.js": "0.13.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import {pathToRegexp} from 'path-to-regexp';
|
||||
import {match} from 'path-to-regexp';
|
||||
|
||||
describe('middleware', function () {
|
||||
before(async function () {
|
||||
@@ -6,19 +6,19 @@ describe('middleware', function () {
|
||||
chai.should();
|
||||
});
|
||||
|
||||
describe('pathToRegexp', function () {
|
||||
describe('match', function () {
|
||||
it('should match static path pattern', function () {
|
||||
const pathname = '/ws/session/1234/appium/device/syslog';
|
||||
const url = 'ws://127.0.0.1:8000/ws/session/1234/appium/device/syslog';
|
||||
const currentPathname = new URL(url).pathname;
|
||||
pathToRegexp(pathname).test(currentPathname).should.be.true;
|
||||
match(pathname)(currentPathname).should.not.be.false;
|
||||
});
|
||||
|
||||
it('should match dynamic path pattern', function () {
|
||||
const pathname = '/ws/session/:sessionId/appium/device/syslog';
|
||||
const url = 'ws://127.0.0.1:8000/ws/session/1234/appium/device/syslog';
|
||||
const currentPathname = new URL(url).pathname;
|
||||
pathToRegexp(pathname).test(currentPathname).should.be.true;
|
||||
match(pathname)(currentPathname).should.not.be.false;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.2.44](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.43...@appium/base-plugin@2.2.44) (2024-09-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [2.2.43](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.42...@appium/base-plugin@2.2.43) (2024-08-07)
|
||||
|
||||
**Note:** Version bump only for package @appium/base-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/base-plugin",
|
||||
"version": "2.2.43",
|
||||
"version": "2.2.44",
|
||||
"description": "The base plugin used to create Appium 2.0 plugins",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -40,8 +40,8 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-driver": "^9.11.3",
|
||||
"@appium/support": "^5.1.3"
|
||||
"@appium/base-driver": "^9.11.4",
|
||||
"@appium/support": "^5.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -3,6 +3,17 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.1.11](https://github.com/appium/appium/compare/@appium/doctor@2.1.10...@appium/doctor@2.1.11) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **doctor:** update dependency appium-adb to v12.5.2 ([db28605](https://github.com/appium/appium/commit/db286055324c980459f12163ec8253c0b90c1754))
|
||||
* **doctor:** update dependency appium-adb to v12.5.3 ([048ce52](https://github.com/appium/appium/commit/048ce520d83f31ceab393f5fe46588274fd2ef56))
|
||||
* **doctor:** update dependency appium-adb to v12.6.0 ([42d7ed8](https://github.com/appium/appium/commit/42d7ed8afe199584cb3850b4a5826d0cb1dc8dc2))
|
||||
|
||||
|
||||
|
||||
## [2.1.10](https://github.com/appium/appium/compare/@appium/doctor@2.1.9...@appium/doctor@2.1.10) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/doctor",
|
||||
"version": "2.1.10",
|
||||
"version": "2.1.11",
|
||||
"description": "Test environment for fitness to run Appium",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -44,11 +44,11 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^5.1.3",
|
||||
"@appium/support": "^5.1.4",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@types/teen_process": "2.0.4",
|
||||
"appium-adb": "12.5.1",
|
||||
"appium-adb": "12.6.0",
|
||||
"bluebird": "3.7.2",
|
||||
"inquirer": "9.2.12",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -3,6 +3,21 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.0.20](https://github.com/appium/appium/compare/@appium/docutils@1.0.19...@appium/docutils@1.0.20) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **docutils:** update dependency diff to v6 ([#20525](https://github.com/appium/appium/issues/20525)) ([f5f0aa5](https://github.com/appium/appium/commit/f5f0aa5068ac6a02c422273e9e857152fea1675a))
|
||||
* **docutils:** update dependency diff to v7 ([#20547](https://github.com/appium/appium/issues/20547)) ([d595990](https://github.com/appium/appium/commit/d5959902bc636f399da876f42b92969f8e2873aa))
|
||||
* **docutils:** update dependency yaml to v2.5.1 ([750872a](https://github.com/appium/appium/commit/750872af4756d2efcd19fe98762f82ecaa59d59a))
|
||||
* **types:** update dependency type-fest to v4 ([#20467](https://github.com/appium/appium/issues/20467)) ([482a1f7](https://github.com/appium/appium/commit/482a1f7bbfbf6478ee09bb1668b830ddbf13b143))
|
||||
* **types:** update dependency type-fest to v4 ([#20471](https://github.com/appium/appium/issues/20471)) ([9a66f48](https://github.com/appium/appium/commit/9a66f4800141cc86c90d58ca1103bab0066081bc))
|
||||
* **types:** update dependency type-fest to v4 ([#20548](https://github.com/appium/appium/issues/20548)) ([5b8cb76](https://github.com/appium/appium/commit/5b8cb76ea3cda75095e79c91539be73feeadf869))
|
||||
* **types:** update dependency type-fest to v4.26.0 ([#20511](https://github.com/appium/appium/issues/20511)) ([8f20c97](https://github.com/appium/appium/commit/8f20c973f4a6d3380163b6afd7f113808453a62d))
|
||||
|
||||
|
||||
|
||||
## [1.0.19](https://github.com/appium/appium/compare/@appium/docutils@1.0.18...@appium/docutils@1.0.19) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/docutils",
|
||||
"version": "1.0.19",
|
||||
"version": "1.0.20",
|
||||
"description": "Documentation generation utilities for Appium and related projects",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -48,13 +48,13 @@
|
||||
"start": "node ./build/lib/cli/index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^5.1.3",
|
||||
"@appium/support": "^5.1.4",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@sliphua/lilconfig-ts-loader": "3.2.2",
|
||||
"@types/which": "3.0.4",
|
||||
"chalk": "4.1.2",
|
||||
"consola": "3.2.3",
|
||||
"diff": "5.2.0",
|
||||
"diff": "7.0.0",
|
||||
"json5": "2.2.3",
|
||||
"lilconfig": "3.1.2",
|
||||
"lodash": "4.17.21",
|
||||
@@ -63,9 +63,9 @@
|
||||
"semver": "7.6.3",
|
||||
"source-map-support": "0.5.21",
|
||||
"teen_process": "2.2.0",
|
||||
"type-fest": "4.23.0",
|
||||
"type-fest": "4.26.1",
|
||||
"typescript": "5.5.4",
|
||||
"yaml": "2.5.0",
|
||||
"yaml": "2.5.1",
|
||||
"yargs": "17.7.2",
|
||||
"yargs-parser": "21.1.1"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mkdocs==1.6.0
|
||||
mkdocs-git-revision-date-localized-plugin==1.2.6
|
||||
mkdocs-material==9.5.31
|
||||
mkdocs==1.6.1
|
||||
mkdocs-git-revision-date-localized-plugin==1.2.9
|
||||
mkdocs-material==9.5.34
|
||||
mkdocs-redirects==1.2.1
|
||||
mike==2.1.2
|
||||
mike==2.1.3
|
||||
|
||||
@@ -3,6 +3,22 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.6.8](https://github.com/appium/appium/compare/@appium/driver-test-support@0.6.7...@appium/driver-test-support@0.6.8) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update dependency axios to v1.7.4 ([d17d022](https://github.com/appium/appium/commit/d17d0222245ab94a78e578c0398734e65a89ba68))
|
||||
* **support:** update dependency axios to v1.7.5 ([fedabb1](https://github.com/appium/appium/commit/fedabb1fdc7af10f9e4b06ea23815c4bc7c6bf5e))
|
||||
* **support:** update dependency axios to v1.7.7 ([7fe67a2](https://github.com/appium/appium/commit/7fe67a286a15a917ce3b1b47a08e982e65bbd9e4))
|
||||
* **test-support:** update dependency sinon to v18.0.1 ([980aa69](https://github.com/appium/appium/commit/980aa69b931bab815e353945f392429a6772182d))
|
||||
* **types:** update dependency type-fest to v4 ([#20467](https://github.com/appium/appium/issues/20467)) ([482a1f7](https://github.com/appium/appium/commit/482a1f7bbfbf6478ee09bb1668b830ddbf13b143))
|
||||
* **types:** update dependency type-fest to v4 ([#20471](https://github.com/appium/appium/issues/20471)) ([9a66f48](https://github.com/appium/appium/commit/9a66f4800141cc86c90d58ca1103bab0066081bc))
|
||||
* **types:** update dependency type-fest to v4 ([#20548](https://github.com/appium/appium/issues/20548)) ([5b8cb76](https://github.com/appium/appium/commit/5b8cb76ea3cda75095e79c91539be73feeadf869))
|
||||
* **types:** update dependency type-fest to v4.26.0 ([#20511](https://github.com/appium/appium/issues/20511)) ([8f20c97](https://github.com/appium/appium/commit/8f20c973f4a6d3380163b6afd7f113808453a62d))
|
||||
|
||||
|
||||
|
||||
## [0.6.7](https://github.com/appium/appium/compare/@appium/driver-test-support@0.6.6...@appium/driver-test-support@0.6.7) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/driver-test-support",
|
||||
"version": "0.6.7",
|
||||
"version": "0.6.8",
|
||||
"description": "Test utilities for Appium drivers",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,19 +41,19 @@
|
||||
},
|
||||
"types": "./build/lib/index.d.ts",
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.21.2",
|
||||
"@appium/types": "^0.21.3",
|
||||
"@types/lodash": "4.17.7",
|
||||
"@types/stoppable": "1.1.3",
|
||||
"axios": "1.7.3",
|
||||
"axios": "1.7.7",
|
||||
"bluebird": "3.7.2",
|
||||
"chai": "5.1.1",
|
||||
"chai-as-promised": "8.0.0",
|
||||
"get-port": "5.1.1",
|
||||
"lodash": "4.17.21",
|
||||
"sinon": "18.0.0",
|
||||
"sinon": "18.0.1",
|
||||
"source-map-support": "0.5.21",
|
||||
"stoppable": "1.1.0",
|
||||
"type-fest": "4.23.0"
|
||||
"type-fest": "4.26.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.43",
|
||||
|
||||
@@ -3,6 +3,16 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.0.34](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.33...@appium/execute-driver-plugin@3.0.34) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.40.3 ([4608563](https://github.com/appium/appium/commit/46085635a92c3a2b2b1b3ecf3966a174248a2829))
|
||||
* **execute-driver-plugin:** update dependency webdriverio to v8.40.5 ([dcb6de2](https://github.com/appium/appium/commit/dcb6de22eaabdcea2517cd9b7db120d681f0e38e))
|
||||
|
||||
|
||||
|
||||
## [3.0.33](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.32...@appium/execute-driver-plugin@3.0.33) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/execute-driver-plugin",
|
||||
"version": "3.0.33",
|
||||
"version": "3.0.34",
|
||||
"description": "Plugin for batching and executing driver commands with Appiums",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -43,7 +43,7 @@
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21",
|
||||
"vm2": "3.9.19",
|
||||
"webdriverio": "8.40.0"
|
||||
"webdriverio": "8.40.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"appium": "^2.0.0-beta.35"
|
||||
|
||||
@@ -3,6 +3,16 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [5.5.3](https://github.com/appium/appium/compare/@appium/fake-driver@5.5.2...@appium/fake-driver@5.5.3) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **universal-xml-plugin:** update dependency @xmldom/xmldom to v0.9.0 ([#20513](https://github.com/appium/appium/issues/20513)) ([da3f9ff](https://github.com/appium/appium/commit/da3f9ff8812be0c25841734293bd852d3a181c36))
|
||||
* **universal-xml-plugin:** update dependency @xmldom/xmldom to v0.9.2 ([#20537](https://github.com/appium/appium/issues/20537)) ([3d674d0](https://github.com/appium/appium/commit/3d674d0085d22959fcf62a195af42ab2f9ba6d3a))
|
||||
|
||||
|
||||
|
||||
## [5.5.2](https://github.com/appium/appium/compare/@appium/fake-driver@5.5.1...@appium/fake-driver@5.5.2) (2024-05-27)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-driver
|
||||
|
||||
@@ -94,7 +94,7 @@ export class FakeApp {
|
||||
this.rawXml = this.rawXml.replace('<app ', '<AppiumAUT><app ');
|
||||
this.rawXml = this.rawXml.replace('<app>', '<AppiumAUT><app>');
|
||||
this.rawXml = this.rawXml.replace('</app>', '</app></AppiumAUT>');
|
||||
this.dom = new XMLDom.DOMParser().parseFromString(this.rawXml);
|
||||
this.dom = new XMLDom.DOMParser().parseFromString(this.rawXml, XMLDom.MIME_TYPE.XML_TEXT);
|
||||
this.activeDom = this.dom;
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ export class FakeApp {
|
||||
activateWebview(wv) {
|
||||
this.activeWebview = wv;
|
||||
let fragment = new XMLDom.XMLSerializer().serializeToString(wv.node);
|
||||
this.activeDom = new XMLDom.DOMParser().parseFromString(fragment, 'application/xml');
|
||||
this.activeDom = new XMLDom.DOMParser().parseFromString(fragment, XMLDom.MIME_TYPE.XML_TEXT);
|
||||
}
|
||||
|
||||
deactivateWebview() {
|
||||
@@ -117,7 +117,7 @@ export class FakeApp {
|
||||
activateFrame(frame) {
|
||||
this.activeFrame = frame;
|
||||
let fragment = new XMLDom.XMLSerializer().serializeToString(frame);
|
||||
this.activeDom = new XMLDom.DOMParser().parseFromString(fragment, 'application/xml');
|
||||
this.activeDom = new XMLDom.DOMParser().parseFromString(fragment, XMLDom.MIME_TYPE.XML_TEXT);
|
||||
}
|
||||
|
||||
deactivateFrame() {
|
||||
|
||||
@@ -108,7 +108,7 @@ export class FakeElement {
|
||||
|
||||
get xmlFragment() {
|
||||
let frag = new XMLDom.XMLSerializer().serializeToString(this.node);
|
||||
return new XMLDom.DOMParser().parseFromString(frag, 'application/xml');
|
||||
return new XMLDom.DOMParser().parseFromString(frag, XMLDom.MIME_TYPE.XML_TEXT);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/fake-driver",
|
||||
"version": "5.5.2",
|
||||
"version": "5.5.3",
|
||||
"description": "Mock driver used internally by Appium for testing. Ignore",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -43,7 +43,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/bluebird": "3.5.42",
|
||||
"@xmldom/xmldom": "0.8.10",
|
||||
"@xmldom/xmldom": "0.9.2",
|
||||
"asyncbox": "3.0.0",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.1.48](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.47...@appium/fake-plugin@3.1.48) (2024-09-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.1.47](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.46...@appium/fake-plugin@3.1.47) (2024-08-07)
|
||||
|
||||
**Note:** Version bump only for package @appium/fake-plugin
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/fake-plugin",
|
||||
"version": "3.1.47",
|
||||
"version": "3.1.48",
|
||||
"description": "A fake Appium 2.0 plugin",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -39,8 +39,8 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/base-plugin": "^2.2.43",
|
||||
"@appium/support": "^5.1.3",
|
||||
"@appium/base-plugin": "^2.2.44",
|
||||
"@appium/support": "^5.1.4",
|
||||
"@types/bluebird": "3.5.42",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.0.19](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.18...@appium/images-plugin@3.0.19) (2024-09-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/images-plugin
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.18](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.17...@appium/images-plugin@3.0.18) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/images-plugin",
|
||||
"version": "3.0.18",
|
||||
"version": "3.0.19",
|
||||
"description": "Plugin for working with images and image elements in Appium",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -39,11 +39,11 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/opencv": "^3.0.5",
|
||||
"@appium/support": "^5.1.3",
|
||||
"@appium/opencv": "^3.0.6",
|
||||
"@appium/support": "^5.1.4",
|
||||
"lodash": "4.17.21",
|
||||
"lru-cache": "10.4.3",
|
||||
"sharp": "0.33.4",
|
||||
"sharp": "0.33.5",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.0.6](https://github.com/appium/appium/compare/@appium/opencv@3.0.5...@appium/opencv@3.0.6) (2024-09-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/opencv
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [3.0.5](https://github.com/appium/appium/compare/@appium/opencv@3.0.4...@appium/opencv@3.0.5) (2024-07-10)
|
||||
|
||||
**Note:** Version bump only for package @appium/opencv
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/opencv",
|
||||
"version": "3.0.5",
|
||||
"version": "3.0.6",
|
||||
"description": "OpenCV-related helper library",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -45,7 +45,7 @@
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"opencv-bindings": "4.5.5",
|
||||
"sharp": "0.33.4",
|
||||
"sharp": "0.33.5",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.3.42](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.41...@appium/plugin-test-support@0.3.42) (2024-09-16)
|
||||
|
||||
**Note:** Version bump only for package @appium/plugin-test-support
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## [0.3.41](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.40...@appium/plugin-test-support@0.3.41) (2024-08-07)
|
||||
|
||||
**Note:** Version bump only for package @appium/plugin-test-support
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/plugin-test-support",
|
||||
"version": "0.3.41",
|
||||
"version": "0.3.42",
|
||||
"description": "Testing utilities for Appium plugins",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -41,7 +41,7 @@
|
||||
"test:unit": "exit 0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/types": "^0.21.2",
|
||||
"@appium/types": "^0.21.3",
|
||||
"get-port": "5.1.1",
|
||||
"log-symbols": "4.1.0",
|
||||
"source-map-support": "0.5.21",
|
||||
|
||||
@@ -3,6 +3,21 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [5.1.4](https://github.com/appium/appium/compare/@appium/support@5.1.3...@appium/support@5.1.4) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **support:** update dependency axios to v1.7.4 ([d17d022](https://github.com/appium/appium/commit/d17d0222245ab94a78e578c0398734e65a89ba68))
|
||||
* **support:** update dependency axios to v1.7.5 ([fedabb1](https://github.com/appium/appium/commit/fedabb1fdc7af10f9e4b06ea23815c4bc7c6bf5e))
|
||||
* **support:** update dependency axios to v1.7.7 ([7fe67a2](https://github.com/appium/appium/commit/7fe67a286a15a917ce3b1b47a08e982e65bbd9e4))
|
||||
* **types:** update dependency type-fest to v4 ([#20467](https://github.com/appium/appium/issues/20467)) ([482a1f7](https://github.com/appium/appium/commit/482a1f7bbfbf6478ee09bb1668b830ddbf13b143))
|
||||
* **types:** update dependency type-fest to v4 ([#20471](https://github.com/appium/appium/issues/20471)) ([9a66f48](https://github.com/appium/appium/commit/9a66f4800141cc86c90d58ca1103bab0066081bc))
|
||||
* **types:** update dependency type-fest to v4 ([#20548](https://github.com/appium/appium/issues/20548)) ([5b8cb76](https://github.com/appium/appium/commit/5b8cb76ea3cda75095e79c91539be73feeadf869))
|
||||
* **types:** update dependency type-fest to v4.26.0 ([#20511](https://github.com/appium/appium/issues/20511)) ([8f20c97](https://github.com/appium/appium/commit/8f20c973f4a6d3380163b6afd7f113808453a62d))
|
||||
|
||||
|
||||
|
||||
## [5.1.3](https://github.com/appium/appium/compare/@appium/support@5.1.2...@appium/support@5.1.3) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/support",
|
||||
"version": "5.1.3",
|
||||
"version": "5.1.4",
|
||||
"description": "Support libs used across appium packages",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -43,7 +43,7 @@
|
||||
"dependencies": {
|
||||
"@appium/logger": "^1.6.1",
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@appium/types": "^0.21.2",
|
||||
"@appium/types": "^0.21.3",
|
||||
"@colors/colors": "1.6.0",
|
||||
"@types/archiver": "6.0.2",
|
||||
"@types/base64-stream": "1.0.5",
|
||||
@@ -61,7 +61,7 @@
|
||||
"@types/uuid": "10.0.0",
|
||||
"@types/which": "3.0.4",
|
||||
"archiver": "7.0.1",
|
||||
"axios": "1.7.3",
|
||||
"axios": "1.7.7",
|
||||
"base64-stream": "1.0.0",
|
||||
"bluebird": "3.7.2",
|
||||
"bplist-creator": "0.1.1",
|
||||
@@ -89,13 +89,13 @@
|
||||
"source-map-support": "0.5.21",
|
||||
"supports-color": "8.1.1",
|
||||
"teen_process": "2.2.0",
|
||||
"type-fest": "4.23.0",
|
||||
"type-fest": "4.26.1",
|
||||
"uuid": "10.0.0",
|
||||
"which": "4.0.0",
|
||||
"yauzl": "3.1.3"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"sharp": "0.33.4"
|
||||
"sharp": "0.33.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -3,6 +3,15 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [3.0.48](https://github.com/appium/appium/compare/@appium/test-support@3.0.47...@appium/test-support@3.0.48) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **test-support:** update dependency sinon to v18.0.1 ([980aa69](https://github.com/appium/appium/commit/980aa69b931bab815e353945f392429a6772182d))
|
||||
|
||||
|
||||
|
||||
## [3.0.47](https://github.com/appium/appium/compare/@appium/test-support@3.0.46...@appium/test-support@3.0.47) (2024-08-07)
|
||||
|
||||
**Note:** Version bump only for package @appium/test-support
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/test-support",
|
||||
"version": "3.0.47",
|
||||
"version": "3.0.48",
|
||||
"description": "A collection of test utilities used across Appium packages",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -45,12 +45,12 @@
|
||||
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@appium/support": "^5.1.3",
|
||||
"@appium/support": "^5.1.4",
|
||||
"@colors/colors": "1.6.0",
|
||||
"bluebird": "3.7.2",
|
||||
"lodash": "4.17.21",
|
||||
"loud-rejection": "2.2.0",
|
||||
"sinon": "18.0.0",
|
||||
"sinon": "18.0.1",
|
||||
"source-map-support": "0.5.21"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -3,6 +3,19 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [0.21.3](https://github.com/appium/appium/compare/@appium/types@0.21.2...@appium/types@0.21.3) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **base-driver:** Add a server flag to check if it operates a secure protocol ([#20449](https://github.com/appium/appium/issues/20449)) ([622b245](https://github.com/appium/appium/commit/622b245ea38793280d9785a59a0416ce025862fe))
|
||||
* **types:** update dependency type-fest to v4 ([#20467](https://github.com/appium/appium/issues/20467)) ([482a1f7](https://github.com/appium/appium/commit/482a1f7bbfbf6478ee09bb1668b830ddbf13b143))
|
||||
* **types:** update dependency type-fest to v4 ([#20471](https://github.com/appium/appium/issues/20471)) ([9a66f48](https://github.com/appium/appium/commit/9a66f4800141cc86c90d58ca1103bab0066081bc))
|
||||
* **types:** update dependency type-fest to v4 ([#20548](https://github.com/appium/appium/issues/20548)) ([5b8cb76](https://github.com/appium/appium/commit/5b8cb76ea3cda75095e79c91539be73feeadf869))
|
||||
* **types:** update dependency type-fest to v4.26.0 ([#20511](https://github.com/appium/appium/issues/20511)) ([8f20c97](https://github.com/appium/appium/commit/8f20c973f4a6d3380163b6afd7f113808453a62d))
|
||||
|
||||
|
||||
|
||||
## [0.21.2](https://github.com/appium/appium/compare/@appium/types@0.21.1...@appium/types@0.21.2) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -45,6 +45,8 @@ export interface AppiumServerExtension {
|
||||
keysFilter?: string | null
|
||||
): Promise<Record<string, WSServer>>;
|
||||
webSocketsMapping: Record<string, WSServer>;
|
||||
/** Returns true if the server operates via HTTPS protocol */
|
||||
isSecure(): boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/types",
|
||||
"version": "0.21.2",
|
||||
"version": "0.21.3",
|
||||
"description": "Various type declarations used across Appium",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -43,7 +43,7 @@
|
||||
"@appium/tsconfig": "^0.3.3",
|
||||
"@types/express": "4.17.21",
|
||||
"@types/ws": "8.5.12",
|
||||
"type-fest": "4.23.0"
|
||||
"type-fest": "4.26.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
|
||||
|
||||
@@ -3,6 +3,17 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.0.22](https://github.com/appium/appium-plugins/compare/@appium/universal-xml-plugin@1.0.21...@appium/universal-xml-plugin@1.0.22) (2024-09-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **universal-xml-plugin:** update dependency @xmldom/xmldom to v0.9.0 ([#20513](https://github.com/appium/appium-plugins/issues/20513)) ([da3f9ff](https://github.com/appium/appium-plugins/commit/da3f9ff8812be0c25841734293bd852d3a181c36))
|
||||
* **universal-xml-plugin:** update dependency @xmldom/xmldom to v0.9.2 ([#20537](https://github.com/appium/appium-plugins/issues/20537)) ([3d674d0](https://github.com/appium/appium-plugins/commit/3d674d0085d22959fcf62a195af42ab2f9ba6d3a))
|
||||
* **universal-xml-plugin:** update dependency fast-xml-parser to v4.5.0 ([75710ab](https://github.com/appium/appium-plugins/commit/75710ab8230a80bf693944b66c84440a86d26b5e))
|
||||
|
||||
|
||||
|
||||
## [1.0.21](https://github.com/appium/appium-plugins/compare/@appium/universal-xml-plugin@1.0.20...@appium/universal-xml-plugin@1.0.21) (2024-08-07)
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import {select as xpathQuery} from 'xpath';
|
||||
import {DOMParser} from '@xmldom/xmldom';
|
||||
import {DOMParser, MIME_TYPE} from '@xmldom/xmldom';
|
||||
import _ from 'lodash';
|
||||
|
||||
export function runQuery(query, xmlStr) {
|
||||
const dom = new DOMParser().parseFromString(xmlStr);
|
||||
const dom = new DOMParser().parseFromString(xmlStr, MIME_TYPE.XML_TEXT);
|
||||
// @ts-expect-error Misssing Node properties are not needed.
|
||||
// https://github.com/xmldom/xmldom/issues/724
|
||||
const nodes = xpathQuery(query, dom);
|
||||
return nodes;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@appium/universal-xml-plugin",
|
||||
"version": "1.0.21",
|
||||
"version": "1.0.22",
|
||||
"description": "Appium plugin for making XML source and XPath queries the same across iOS and Android",
|
||||
"keywords": [
|
||||
"automation",
|
||||
@@ -37,8 +37,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/xmldom": "0.1.34",
|
||||
"@xmldom/xmldom": "0.8.10",
|
||||
"fast-xml-parser": "4.4.1",
|
||||
"@xmldom/xmldom": "0.9.2",
|
||||
"fast-xml-parser": "4.5.0",
|
||||
"lodash": "4.17.21",
|
||||
"source-map-support": "0.5.21",
|
||||
"xpath": "0.0.34"
|
||||
|
||||
@@ -45,7 +45,7 @@ describe('UniversalXMLPlugin', function () {
|
||||
driver.caps = {platformName: 'iOS'};
|
||||
// mock out the findElement function to just return an xml node from the fixture
|
||||
driver.findElement = (strategy, selector) => {
|
||||
const nodes = runQuery(selector, XML_IOS.replace(/<\/?AppiumAUT>/, ''));
|
||||
const nodes = runQuery(selector, XML_IOS.replace(/<\/?AppiumAUT>/g, ''));
|
||||
return nodes[0];
|
||||
};
|
||||
const node = await p.findElement(next, driver, 'xpath', '//TextInput[@axId="username"]');
|
||||
|
||||
@@ -57,7 +57,6 @@ Appium extension authors--or anyone else--may use this config as well.
|
||||
### Additional Config
|
||||
|
||||
- Uses the parent directory for the commit scope if applicable; otherwise uses `deps`. The parent directory is _typically_ only applicable in monorepos.
|
||||
- Attempts transititive remediation of vulns
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
},
|
||||
{
|
||||
"extends": ["packages:eslint"],
|
||||
"matchPackagePrefixes": ["@appium/eslint-config-appium"],
|
||||
"matchPackageNames": ["@appium/eslint-config-appium**"],
|
||||
"groupName": "ESLint-related packages",
|
||||
"groupSlug": "eslint"
|
||||
},
|
||||
@@ -55,13 +55,10 @@
|
||||
"groupSlug": "teen_process"
|
||||
},
|
||||
{
|
||||
"matchPackagePrefixes": ["@appium/"],
|
||||
"excludePackageNames": ["@appium/eslint-config-appium", "@appium/eslint-config-appium-ts"],
|
||||
"matchPackageNames": "appium",
|
||||
"matchPackageNames": ["appium", "@appium/**", "!@appium/eslint-config-appium**"],
|
||||
"groupName": "Appium-related packages",
|
||||
"groupSlug": "appium"
|
||||
}
|
||||
],
|
||||
"semanticCommitScope": "{{#if parentDir}}{{parentDir}}{{else}}deps{{/if}}",
|
||||
"transitiveRemediation": true
|
||||
"semanticCommitScope": "{{#if parentDir}}{{parentDir}}{{else}}deps{{/if}}"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user