Skip to content

Commit 3b03baa

Browse files
authored
Merge pull request #20 from FlaUI/support-xpath
Support X-Path selectors
2 parents e1f7914 + e9eab1e commit 3b03baa

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ On Windows, the recommended selectors, in order of reliability are:
9595
| Link text selector | `"link text"` | :white_check_mark: |
9696
| Partial link text selector | `"partial link text"` | :white_check_mark: |
9797
| Tag name | `"tag name"` | :white_check_mark: |
98-
| XPath selector | `"xpath"` | |
98+
| XPath selector | `"xpath"` | :white_check_mark: |
9999
| CSS selector | `"css selector"` | Only ID, class or `name` attribute selectors. IDs are interpreted as automation IDs. |
100100

101101
Using the Selenium C# client, the selectors are:
@@ -107,6 +107,7 @@ driver.FindElement(By.ClassName("TextBox")).Click();
107107
driver.FindElement(By.LinkText("Button")).Click();
108108
driver.FindElement(By.PartialLinkText("Button")).Click();
109109
driver.FindElement(By.TagName("RadioButton")).Click();
110+
driver.FindElement(By.XPath("//RadioButton")).Click();
110111
```
111112

112113
Using the WebdriverIO JavaScript client (see [WebdriverIO Selectors guide](https://webdriver.io/docs/selectors):
@@ -118,6 +119,7 @@ await driver.$('.TextBox').click();
118119
await driver.$('=Button').click();
119120
await driver.$('*=Button').click();
120121
await driver.$('<RadioButton />').click();
122+
await driver.$('//RadioButton').click();
121123
```
122124

123125
## Windows

src/FlaUI.WebDriver.UITests/FindElementsTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@ namespace FlaUI.WebDriver.UITests
88
{
99
public class FindElementsTests
1010
{
11+
[Test]
12+
public void FindElement_ByXPath_ReturnsElement()
13+
{
14+
var driverOptions = FlaUIDriverOptions.TestApp();
15+
using var driver = new RemoteWebDriver(WebDriverFixture.WebDriverUrl, driverOptions);
16+
17+
var element = driver.FindElement(By.XPath("//Text"));
18+
19+
Assert.That(element, Is.Not.Null);
20+
}
21+
1122
[Test]
1223
public void FindElement_ByAccessibilityId_ReturnsElement()
1324
{

src/FlaUI.WebDriver/Controllers/FindElementsController.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,16 @@ public async Task<ActionResult> FindElementsFromElement([FromRoute] string sessi
5656

5757
private static async Task<ActionResult> FindElementFrom(Func<AutomationElement> startNode, FindElementRequest findElementRequest, Session session)
5858
{
59-
var condition = GetCondition(session.Automation.ConditionFactory, findElementRequest.Using, findElementRequest.Value);
60-
AutomationElement? element = await Wait.Until(() => startNode().FindFirstDescendant(condition), element => element != null, session.ImplicitWaitTimeout);
59+
AutomationElement? element;
60+
if (findElementRequest.Using == "xpath")
61+
{
62+
element = await Wait.Until(() => startNode().FindFirstByXPath(findElementRequest.Value), element => element != null, session.ImplicitWaitTimeout);
63+
}
64+
else
65+
{
66+
var condition = GetCondition(session.Automation.ConditionFactory, findElementRequest.Using, findElementRequest.Value);
67+
element = await Wait.Until(() => startNode().FindFirstDescendant(condition), element => element != null, session.ImplicitWaitTimeout);
68+
}
6169

6270
if (element == null)
6371
{
@@ -73,8 +81,16 @@ private static async Task<ActionResult> FindElementFrom(Func<AutomationElement>
7381

7482
private static async Task<ActionResult> FindElementsFrom(Func<AutomationElement> startNode, FindElementRequest findElementRequest, Session session)
7583
{
76-
var condition = GetCondition(session.Automation.ConditionFactory, findElementRequest.Using, findElementRequest.Value);
77-
AutomationElement[] elements = await Wait.Until(() => startNode().FindAllDescendants(condition), elements => elements.Length > 0, session.ImplicitWaitTimeout);
84+
AutomationElement[] elements;
85+
if (findElementRequest.Using == "xpath")
86+
{
87+
elements = await Wait.Until(() => startNode().FindAllByXPath(findElementRequest.Value), elements => elements.Length > 0, session.ImplicitWaitTimeout);
88+
}
89+
else
90+
{
91+
var condition = GetCondition(session.Automation.ConditionFactory, findElementRequest.Using, findElementRequest.Value);
92+
elements = await Wait.Until(() => startNode().FindAllDescendants(condition), elements => elements.Length > 0, session.ImplicitWaitTimeout);
93+
}
7894

7995
if (elements.Length == 0)
8096
{

0 commit comments

Comments
 (0)