| import '../../common/by.dart'; |
| import '../../common/request.dart'; |
| import '../../common/webdriver_handler.dart'; |
| import 'utils.dart'; |
| |
| class W3cElementFinder extends ElementFinder { |
| /// Here we massage [By] instances into viable W3C /element requests. |
| /// |
| /// In principle, W3C spec implementations should be nearly the same as |
| /// the existing JSON wire spec. In practice compliance is uneven. |
| Map<String, String> _byToJson(By by) { |
| String using; |
| String value; |
| |
| switch (by.using) { |
| case 'id': // This doesn't exist in the W3C spec. |
| using = 'css selector'; |
| value = '#${by.value}'; |
| break; |
| case 'name': // This doesn't exist in the W3C spec. |
| using = 'css selector'; |
| value = '[name=${by.value}]'; |
| break; |
| case 'tag name': // This is in the W3C spec, but not in geckodriver. |
| using = 'css selector'; |
| value = by.value; |
| break; |
| case 'class name': // This doesn't exist in the W3C spec. |
| using = 'css selector'; |
| value = '.${by.value}'; |
| break; |
| // xpath, css selector, link text, partial link text, seem fine. |
| default: |
| using = by.using; |
| value = by.value; |
| } |
| |
| return {'using': using, 'value': value}; |
| } |
| |
| @override |
| WebDriverRequest buildFindElementsRequest(By by, [String? contextElementId]) { |
| var uri = '${elementPrefix(contextElementId)}elements'; |
| return WebDriverRequest.postRequest(uri, _byToJson(by)); |
| } |
| |
| @override |
| List<String> parseFindElementsResponse(WebDriverResponse response) => |
| (parseW3cResponse(response) as List) |
| .map<String>((e) => e[w3cElementStr] as String) |
| .toList(); |
| |
| @override |
| WebDriverRequest buildFindElementRequest(By by, [String? contextElementId]) { |
| var uri = '${elementPrefix(contextElementId)}element'; |
| return WebDriverRequest.postRequest(uri, _byToJson(by)); |
| } |
| |
| @override |
| String? parseFindActiveElementResponse(WebDriverResponse response) => |
| parseW3cResponse(response)[w3cElementStr] as String; |
| |
| @override |
| WebDriverRequest buildFindActiveElementRequest() => |
| WebDriverRequest.getRequest('element/active'); |
| |
| @override |
| String parseFindElementResponse(WebDriverResponse response) => |
| (parseW3cResponse(response) ?? {})[w3cElementStr] as String; |
| } |