Changeset 289202 in webkit
- Timestamp:
- Feb 7, 2022, 2:25:15 AM (4 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebDriver/ChangeLog
r288950 r289202 1 2022-02-07 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [WebDriver] Add support for shadow roots 4 https://bugs.webkit.org/show_bug.cgi?id=230614 5 <rdar://problem/83667535> 6 7 Reviewed by Adrian Perez de Castro. 8 9 Add implementation of new shadow root commands. 10 11 * CommandResult.cpp: 12 (WebDriver::CommandResult::httpStatusCode const): Handle NoSuchShadowRoot and DetachedShadowRoot errors 13 (WebDriver::CommandResult::errorString const): Ditto. 14 * CommandResult.h: 15 * Session.cpp: 16 (WebDriver::Session::shadowRootIdentifier): Return shadow root identifier. 17 (WebDriver::Session::createShadowRoot): Create shadow root elment using the shadow root identifier. 18 (WebDriver::Session::findElements): Add ElementIsShadowRoot parameters to handle DetachedShadowRoot error. 19 (WebDriver::Session::getElementShadowRoot): Return the element shadow root. 20 * Session.h: 21 * WebDriverService.cpp: 22 (WebDriver::WebDriverService::findElement): Pass ElementIsShadowRoot::No to Session::findElements(). 23 (WebDriver::WebDriverService::findElements): Ditto. 24 (WebDriver::WebDriverService::findElementFromElement): Ditto. 25 (WebDriver::WebDriverService::findElementsFromElement): Ditto. 26 (WebDriver::WebDriverService::findElementFromShadowRoot): 27 (WebDriver::WebDriverService::findElementsFromShadowRoot): 28 (WebDriver::WebDriverService::getElementShadowRoot): 29 * WebDriverService.h: 30 1 31 2022-02-02 Youenn Fablet <youenn@apple.com> 2 32 -
trunk/Source/WebDriver/CommandResult.cpp
r278253 r289202 146 146 case ErrorCode::NoSuchFrame: 147 147 case ErrorCode::NoSuchWindow: 148 case ErrorCode::NoSuchShadowRoot: 148 149 case ErrorCode::StaleElementReference: 150 case ErrorCode::DetachedShadowRoot: 149 151 case ErrorCode::InvalidSessionID: 150 152 case ErrorCode::UnknownCommand: … … 177 179 case ErrorCode::ElementNotInteractable: 178 180 return "element not interactable"_s; 181 case ErrorCode::DetachedShadowRoot: 182 return "detached shadow root"_s; 179 183 case ErrorCode::InvalidArgument: 180 184 return "invalid argument"_s; … … 195 199 case ErrorCode::NoSuchFrame: 196 200 return "no such frame"_s; 201 case ErrorCode::NoSuchShadowRoot: 202 return "no such shadow root"_s; 197 203 case ErrorCode::NoSuchWindow: 198 204 return "no such window"_s; -
trunk/Source/WebDriver/CommandResult.h
r278253 r289202 40 40 ElementNotSelectable, 41 41 ElementNotInteractable, 42 DetachedShadowRoot, 42 43 InvalidArgument, 43 44 InvalidElementState, … … 50 51 NoSuchElement, 51 52 NoSuchFrame, 53 NoSuchShadowRoot, 52 54 NoSuchWindow, 53 55 ScriptTimeout, -
trunk/Source/WebDriver/Session.cpp
r282755 r289202 53 53 } 54 54 55 const String& Session::shadowRootIdentifier() 56 { 57 // The shadow root identifier is constant defined by the spec. 58 static NeverDestroyed<String> shadowRootID { "shadow-6066-11e4-a52e-4f735466cecf"_s }; 59 return shadowRootID; 60 } 61 55 62 Session::Session(std::unique_ptr<SessionHost>&& host) 56 63 : m_host(WTFMove(host)) … … 985 992 } 986 993 994 RefPtr<JSON::Object> Session::createShadowRoot(RefPtr<JSON::Value>&& value) 995 { 996 if (!value) 997 return nullptr; 998 999 auto valueObject = value->asObject(); 1000 if (!valueObject) 1001 return nullptr; 1002 1003 auto elementID = valueObject->getString("session-node-" + id()); 1004 if (!elementID) 1005 return nullptr; 1006 1007 auto elementObject = JSON::Object::create(); 1008 elementObject->setString(shadowRootIdentifier(), elementID); 1009 return elementObject; 1010 } 1011 987 1012 RefPtr<JSON::Object> Session::extractElement(JSON::Value& value) 988 1013 { … … 1076 1101 } 1077 1102 1078 void Session::findElements(const String& strategy, const String& selector, FindElementsMode mode, const String& rootElementID, Function<void(CommandResult&&)>&& completionHandler)1103 void Session::findElements(const String& strategy, const String& selector, FindElementsMode mode, const String& rootElementID, ElementIsShadowRoot isShadowRoot, Function<void(CommandResult&&)>&& completionHandler) 1079 1104 { 1080 1105 if (!m_currentBrowsingContext) { … … 1083 1108 } 1084 1109 1085 handleUserPrompts([this, protectedThis = Ref { *this }, strategy, selector, mode, rootElementID, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable {1110 handleUserPrompts([this, protectedThis = Ref { *this }, strategy, selector, mode, rootElementID, isShadowRoot, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable { 1086 1111 if (result.isError()) { 1087 1112 completionHandler(WTFMove(result)); … … 1109 1134 parameters->setDouble("callbackTimeout"_s, m_implicitWaitTimeout + 1000); 1110 1135 1111 m_host->sendCommandToBackend("evaluateJavaScriptFunction"_s, WTFMove(parameters), [this, protectedThis, mode, completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) {1136 m_host->sendCommandToBackend("evaluateJavaScriptFunction"_s, WTFMove(parameters), [this, protectedThis, mode, isShadowRoot, completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) { 1112 1137 if (response.isError || !response.responseObject) { 1113 completionHandler(CommandResult::fail(WTFMove(response.responseObject))); 1138 auto result = CommandResult::fail(WTFMove(response.responseObject)); 1139 if (isShadowRoot == ElementIsShadowRoot::Yes && result.errorCode() == CommandResult::ErrorCode::StaleElementReference) { 1140 completionHandler(CommandResult::fail(CommandResult::ErrorCode::DetachedShadowRoot)); 1141 return; 1142 } 1143 completionHandler(WTFMove(result)); 1114 1144 return; 1115 1145 } … … 1196 1226 if (!elementObject) { 1197 1227 completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchElement)); 1228 return; 1229 } 1230 completionHandler(CommandResult::success(WTFMove(elementObject))); 1231 }); 1232 }); 1233 } 1234 1235 void Session::getElementShadowRoot(const String& elementID, Function<void(CommandResult&&)>&& completionHandler) 1236 { 1237 if (!m_currentBrowsingContext) { 1238 completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchWindow)); 1239 return; 1240 } 1241 1242 handleUserPrompts([this, protectedThis = Ref { *this }, elementID, completionHandler = WTFMove(completionHandler)](CommandResult&& result) mutable { 1243 if (result.isError()) { 1244 completionHandler(WTFMove(result)); 1245 return; 1246 } 1247 1248 auto arguments = JSON::Array::create(); 1249 arguments->pushString(createElement(elementID)->toJSONString()); 1250 1251 auto parameters = JSON::Object::create(); 1252 parameters->setString("browsingContextHandle"_s, m_toplevelBrowsingContext.value()); 1253 if (m_currentBrowsingContext) 1254 parameters->setString("frameHandle"_s, m_currentBrowsingContext.value()); 1255 parameters->setString("function"_s, "function(element) { return element.shadowRoot; }"_s); 1256 parameters->setArray("arguments"_s, WTFMove(arguments)); 1257 m_host->sendCommandToBackend("evaluateJavaScriptFunction"_s, WTFMove(parameters), [this, protectedThis, completionHandler = WTFMove(completionHandler)](SessionHost::CommandResponse&& response) { 1258 if (response.isError || !response.responseObject) { 1259 completionHandler(CommandResult::fail(WTFMove(response.responseObject))); 1260 return; 1261 } 1262 1263 auto valueString = response.responseObject->getString("result"_s); 1264 if (!valueString) { 1265 completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError)); 1266 return; 1267 } 1268 1269 auto resultValue = JSON::Value::parseJSON(valueString); 1270 if (!resultValue) { 1271 completionHandler(CommandResult::fail(CommandResult::ErrorCode::UnknownError)); 1272 return; 1273 } 1274 1275 auto elementObject = createShadowRoot(WTFMove(resultValue)); 1276 if (!elementObject) { 1277 completionHandler(CommandResult::fail(CommandResult::ErrorCode::NoSuchShadowRoot)); 1198 1278 return; 1199 1279 } -
trunk/Source/WebDriver/Session.h
r278253 r289202 56 56 double implicitWaitTimeout() const { return m_implicitWaitTimeout; } 57 57 static const String& webElementIdentifier(); 58 static const String& shadowRootIdentifier(); 58 59 59 60 enum class FindElementsMode { Single, Multiple }; 60 61 enum class ExecuteScriptMode { Sync, Async }; 62 enum class ElementIsShadowRoot { No, Yes }; 61 63 62 64 struct Cookie { … … 97 99 void minimizeWindow(Function<void (CommandResult&&)>&&); 98 100 void fullscreenWindow(Function<void (CommandResult&&)>&&); 99 void findElements(const String& strategy, const String& selector, FindElementsMode, const String& rootElementID, Function<void(CommandResult&&)>&&);101 void findElements(const String& strategy, const String& selector, FindElementsMode, const String& rootElementID, ElementIsShadowRoot, Function<void(CommandResult&&)>&&); 100 102 void getActiveElement(Function<void (CommandResult&&)>&&); 103 void getElementShadowRoot(const String& elementID, Function<void(CommandResult&&)>&&); 101 104 void isElementSelected(const String& elementID, Function<void (CommandResult&&)>&&); 102 105 void getElementAttribute(const String& elementID, const String& attribute, Function<void (CommandResult&&)>&&); … … 147 150 RefPtr<JSON::Object> createElement(RefPtr<JSON::Value>&&); 148 151 Ref<JSON::Object> createElement(const String& elementID); 152 RefPtr<JSON::Object> createShadowRoot(RefPtr<JSON::Value>&&); 149 153 RefPtr<JSON::Object> extractElement(JSON::Value&); 150 154 String extractElementID(JSON::Value&); -
trunk/Source/WebDriver/WebDriverService.cpp
r278253 r289202 174 174 { HTTPMethod::Post, "/session/$sessionId/element/$elementId/element", &WebDriverService::findElementFromElement }, 175 175 { HTTPMethod::Post, "/session/$sessionId/element/$elementId/elements", &WebDriverService::findElementsFromElement }, 176 { HTTPMethod::Post, "/session/$sessionId/shadow/$shadowId/element", &WebDriverService::findElementFromShadowRoot }, 177 { HTTPMethod::Post, "/session/$sessionId/shadow/$shadowId/elements", &WebDriverService::findElementsFromShadowRoot }, 176 178 { HTTPMethod::Get, "/session/$sessionId/element/active", &WebDriverService::getActiveElement }, 177 179 180 { HTTPMethod::Get, "/session/$sessionId/element/$elementId/shadow", &WebDriverService::getElementShadowRoot }, 178 181 { HTTPMethod::Get, "/session/$sessionId/element/$elementId/selected", &WebDriverService::isElementSelected }, 179 182 { HTTPMethod::Get, "/session/$sessionId/element/$elementId/attribute/$name", &WebDriverService::getElementAttribute }, … … 1294 1297 } 1295 1298 1296 static std::optional<String> findElementOrCompleteWithError(JSON::Object& parameters, Function<void (CommandResult&&)>& completionHandler )1297 { 1298 auto elementID = parameters.getString( "elementId"_s);1299 static std::optional<String> findElementOrCompleteWithError(JSON::Object& parameters, Function<void (CommandResult&&)>& completionHandler, Session::ElementIsShadowRoot isShadowRoot = Session::ElementIsShadowRoot::No) 1300 { 1301 auto elementID = parameters.getString(isShadowRoot == Session::ElementIsShadowRoot::Yes ? "shadowId"_s : "elementId"_s); 1299 1302 if (elementID.isEmpty()) { 1300 1303 completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidArgument)); … … 1315 1318 } 1316 1319 1317 static bool findStrategyAndSelectorOrCompleteWithError(JSON::Object& parameters, Function<void (CommandResult&&)>& completionHandler, S tring& strategy, String& selector)1320 static bool findStrategyAndSelectorOrCompleteWithError(JSON::Object& parameters, Function<void (CommandResult&&)>& completionHandler, Session::ElementIsShadowRoot isShadowRoot, String& strategy, String& selector) 1318 1321 { 1319 1322 strategy = parameters.getString("using"_s); … … 1327 1330 return false; 1328 1331 } 1332 1333 if (isShadowRoot == Session::ElementIsShadowRoot::Yes) { 1334 // Currently there is an opened discussion about if the following values has to be supported for a Shadow Root 1335 // because the current implementation doesn't support them. We have them disabled for now. 1336 // https://github.com/w3c/webdriver/issues/1610 1337 if (strategy == "tag name" || strategy == "xpath") { 1338 completionHandler(CommandResult::fail(CommandResult::ErrorCode::InvalidSelector)); 1339 return false; 1340 } 1341 } 1342 1329 1343 return true; 1330 1344 } … … 1338 1352 1339 1353 String strategy, selector; 1340 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, strategy, selector))1354 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, Session::ElementIsShadowRoot::No, strategy, selector)) 1341 1355 return; 1342 1356 … … 1346 1360 return; 1347 1361 } 1348 m_session->findElements(strategy, selector, Session::FindElementsMode::Single, emptyString(), WTFMove(completionHandler));1362 m_session->findElements(strategy, selector, Session::FindElementsMode::Single, emptyString(), Session::ElementIsShadowRoot::No, WTFMove(completionHandler)); 1349 1363 }); 1350 1364 } … … 1358 1372 1359 1373 String strategy, selector; 1360 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, strategy, selector))1374 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, Session::ElementIsShadowRoot::No, strategy, selector)) 1361 1375 return; 1362 1376 … … 1366 1380 return; 1367 1381 } 1368 m_session->findElements(strategy, selector, Session::FindElementsMode::Multiple, emptyString(), WTFMove(completionHandler));1382 m_session->findElements(strategy, selector, Session::FindElementsMode::Multiple, emptyString(), Session::ElementIsShadowRoot::No, WTFMove(completionHandler)); 1369 1383 }); 1370 1384 } … … 1382 1396 1383 1397 String strategy, selector; 1384 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, strategy, selector)) 1385 return; 1386 1387 m_session->findElements(strategy, selector, Session::FindElementsMode::Single, elementID.value(), WTFMove(completionHandler)); 1398 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, Session::ElementIsShadowRoot::No, strategy, selector)) 1399 return; 1400 m_session->findElements(strategy, selector, Session::FindElementsMode::Single, elementID.value(), Session::ElementIsShadowRoot::No, WTFMove(completionHandler)); 1388 1401 } 1389 1402 … … 1400 1413 1401 1414 String strategy, selector; 1402 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, strategy, selector)) 1403 return; 1404 1405 m_session->findElements(strategy, selector, Session::FindElementsMode::Multiple, elementID.value(), WTFMove(completionHandler)); 1415 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, Session::ElementIsShadowRoot::No, strategy, selector)) 1416 return; 1417 1418 m_session->findElements(strategy, selector, Session::FindElementsMode::Multiple, elementID.value(), Session::ElementIsShadowRoot::No, WTFMove(completionHandler)); 1419 } 1420 1421 void WebDriverService::findElementFromShadowRoot(RefPtr<JSON::Object>&& parameters, Function<void(CommandResult&&)>&& completionHandler) 1422 { 1423 if (!findSessionOrCompleteWithError(*parameters, completionHandler)) 1424 return; 1425 1426 auto shadowID = findElementOrCompleteWithError(*parameters, completionHandler, Session::ElementIsShadowRoot::Yes); 1427 if (!shadowID) 1428 return; 1429 1430 String strategy, selector; 1431 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, Session::ElementIsShadowRoot::Yes, strategy, selector)) 1432 return; 1433 1434 m_session->findElements(strategy, selector, Session::FindElementsMode::Single, shadowID.value(), Session::ElementIsShadowRoot::Yes, WTFMove(completionHandler)); 1435 } 1436 1437 void WebDriverService::findElementsFromShadowRoot(RefPtr<JSON::Object>&& parameters, Function<void(CommandResult&&)>&& completionHandler) 1438 { 1439 if (!findSessionOrCompleteWithError(*parameters, completionHandler)) 1440 return; 1441 1442 auto shadowID = findElementOrCompleteWithError(*parameters, completionHandler, Session::ElementIsShadowRoot::Yes); 1443 if (!shadowID) 1444 return; 1445 1446 String strategy, selector; 1447 if (!findStrategyAndSelectorOrCompleteWithError(*parameters, completionHandler, Session::ElementIsShadowRoot::Yes, strategy, selector)) 1448 return; 1449 1450 m_session->findElements(strategy, selector, Session::FindElementsMode::Multiple, shadowID.value(), Session::ElementIsShadowRoot::Yes, WTFMove(completionHandler)); 1406 1451 } 1407 1452 … … 1420 1465 m_session->getActiveElement(WTFMove(completionHandler)); 1421 1466 }); 1467 } 1468 1469 void WebDriverService::getElementShadowRoot(RefPtr<JSON::Object>&& parameters, Function<void(CommandResult&&)>&& completionHandler) 1470 { 1471 if (!findSessionOrCompleteWithError(*parameters, completionHandler)) 1472 return; 1473 1474 auto elementID = findElementOrCompleteWithError(*parameters, completionHandler); 1475 if (!elementID) 1476 return; 1477 1478 m_session->getElementShadowRoot(elementID.value(), WTFMove(completionHandler)); 1422 1479 } 1423 1480 -
trunk/Source/WebDriver/WebDriverService.h
r278253 r289202 89 89 void findElementFromElement(RefPtr<JSON::Object>&&, Function<void (CommandResult&&)>&&); 90 90 void findElementsFromElement(RefPtr<JSON::Object>&&, Function<void (CommandResult&&)>&&); 91 void findElementFromShadowRoot(RefPtr<JSON::Object>&&, Function<void(CommandResult&&)>&&); 92 void findElementsFromShadowRoot(RefPtr<JSON::Object>&&, Function<void(CommandResult&&)>&&); 91 93 void getActiveElement(RefPtr<JSON::Object>&&, Function<void (CommandResult&&)>&&); 94 void getElementShadowRoot(RefPtr<JSON::Object>&&, Function<void(CommandResult&&)>&&); 92 95 void isElementSelected(RefPtr<JSON::Object>&&, Function<void (CommandResult&&)>&&); 93 96 void getElementAttribute(RefPtr<JSON::Object>&&, Function<void (CommandResult&&)>&&); -
trunk/Source/WebKit/ChangeLog
r289200 r289202 1 2022-02-07 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [WebDriver] Add support for shadow roots 4 https://bugs.webkit.org/show_bug.cgi?id=230614 5 <rdar://problem/83667535> 6 7 Reviewed by Adrian Perez de Castro. 8 9 Use querySelectorAll() instead of getElementsByTagName() because it is also available for shadow root. 10 11 * UIProcess/Automation/atoms/FindNodes.js: 12 (tryToFindNode): 13 1 14 2022-02-06 Sihui Liu <sihui_liu@apple.com> 2 15 -
trunk/Source/WebKit/UIProcess/Automation/atoms/FindNodes.js
r225388 r289202 67 67 case "link text": 68 68 let linkTextResult = []; 69 for (let link of ancestorElement. getElementsByTagName("a")) {69 for (let link of ancestorElement.querySelectorAll("a")) { 70 70 if (link.text.trim() == query) { 71 71 linkTextResult.push(link); … … 80 80 case "partial link text": 81 81 let partialLinkResult = []; 82 for (let link of ancestorElement. getElementsByTagName("a")) {82 for (let link of ancestorElement.querySelectorAll("a")) { 83 83 if (link.text.includes(query)) { 84 84 partialLinkResult.push(link); -
trunk/WebDriverTests/ChangeLog
r289047 r289202 1 2022-02-07 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [WebDriver] Add support for shadow roots 4 https://bugs.webkit.org/show_bug.cgi?id=230614 5 <rdar://problem/83667535> 6 7 Reviewed by Adrian Perez de Castro. 8 9 Update test expectations. 10 11 * TestExpectations.json: 12 1 13 2022-02-03 Carlos Garcia Campos <cgarcia@igalia.com> 2 14 -
trunk/WebDriverTests/TestExpectations.json
r288871 r289202 1570 1570 }, 1571 1571 "imported/w3c/webdriver/tests/find_element_from_shadow_root/find.py": { 1572 "expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230614"}} 1573 }, 1574 "imported/w3c/webdriver/tests/find_element_from_shadow_root/user_prompts.py": { 1575 "expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230614"}} 1572 "subtests": { 1573 "test_find_element[tag name-a]": { 1574 "expected": { "all": { "status": ["SKIP"]}} 1575 }, 1576 "test_find_element[xpath-//a]": { 1577 "expected": { "all": { "status": ["SKIP"]}} 1578 }, 1579 "test_find_element_link_text[<a href=#>link<br>text</a>-link\\ntext]": { 1580 "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184964"}} 1581 }, 1582 "test_find_element_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT]": { 1583 "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184964"}} 1584 }, 1585 "test_find_element_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt]": { 1586 "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184964"}} 1587 }, 1588 "test_find_element_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK]": { 1589 "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184964"}} 1590 } 1591 } 1576 1592 }, 1577 1593 "imported/w3c/webdriver/tests/find_elements_from_shadow_root/find.py": { 1578 "expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230614"}} 1579 }, 1580 "imported/w3c/webdriver/tests/find_elements_from_shadow_root/user_prompts.py": { 1581 "expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230614"}} 1594 "subtests": { 1595 "test_find_elements[tag name-a]": { 1596 "expected": { "all": { "status": ["SKIP"]}} 1597 }, 1598 "test_find_elements[xpath-//a]": { 1599 "expected": { "all": { "status": ["SKIP"]}} 1600 }, 1601 "test_find_elements_link_text[<a href=#>link<br>text</a>-link\\ntext]": { 1602 "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184964"}} 1603 }, 1604 "test_find_elements_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT]": { 1605 "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184964"}} 1606 }, 1607 "test_find_elements_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt]": { 1608 "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184964"}} 1609 }, 1610 "test_find_elements_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK]": { 1611 "expected": {"all": {"status": ["FAIL"], "bug": "webkit.org/b/184964"}} 1612 } 1613 } 1582 1614 }, 1583 1615 "imported/w3c/webdriver/tests/get_element_shadow_root/get.py": { 1584 "expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230614"}} 1585 }, 1586 "imported/w3c/webdriver/tests/get_element_shadow_root/user_prompts.py": { 1587 "expected": { "all": { "status": ["SKIP"], "bug": "webkit.org/b/230614"}} 1616 "subtests": { 1617 "test_no_top_browsing_context": { 1618 "expected": { 1619 "wpe": {"status": ["FAIL"], "bug": "webkit.org/b/212950"}, 1620 "gtk": {"status": ["FAIL"], "bug": "webkit.org/b/230612"} 1621 } 1622 } 1623 } 1588 1624 }, 1589 1625 "imported/w3c/webdriver/tests/bidi/new_session/connect.py": {
Note:
See TracChangeset
for help on using the changeset viewer.