/// <summary> /// Gets a mechanism to find elements by their CSS class. /// </summary> /// <param name="classNameToFind">The CSS class to find.</param> /// <returns>A <see cref="By"/> object the driver can use to find the elements.</returns> /// <remarks>If an element has many classes then this will match against each of them. /// For example if the value is "one two onone", then the following values for the /// className parameter will match: "one" and "two".</remarks> public static By ClassName(string classNameToFind) { if (classNameToFind == null) { throw new ArgumentNullException("classNameToFind", "Cannot find elements when the class name expression is null."); } By by = new By(); by.description = "By.ClassName[Contains]: " + classNameToFind; by.mechanism = "css selector"; by.criteria = "." + By.EscapeCssSelector(classNameToFind); if (by.criteria.Contains(" ")) { // Finding elements by class name with whitespace is not allowed. // However, converting the single class name to a valid CSS selector // by prepending a '.' may result in a still-valid, but incorrect // selector. Thus, we short-ciruit that behavior here. throw new InvalidSelectorException("Compound class names not allowed. Cannot have whitespace in class name. Use CSS selectors instead."); } by.findElementMethod = (ISearchContext context) => ((IFindsElement)context).FindElement(by.mechanism, by.criteria); by.findElementsMethod = (ISearchContext context) => ((IFindsElement)context).FindElements(by.mechanism, by.criteria); return(by); }
/// <summary> /// Gets a mechanism to find elements by their ID. /// </summary> /// <param name="idToFind">The ID to find.</param> /// <returns>A <see cref="By"/> object the driver can use to find the elements.</returns> public static By Id(string idToFind) { if (idToFind == null) { throw new ArgumentNullException("idToFind", "Cannot find elements with a null id attribute."); } By by = new By(); by.description = "By.Id: " + idToFind; by.mechanism = "css selector"; string selector = By.EscapeCssSelector(idToFind); by.criteria = "#" + selector; by.findElementMethod = (ISearchContext context) => ((IFindsElement)context).FindElement(by.mechanism, by.criteria); if (string.IsNullOrEmpty(selector)) { // Finding multiple elements with an empty ID will return // an empty list. However, finding by a CSS selector of '#' // throws an exception, even in the multiple elements case, // which means we need to short-circuit that behavior. by.findElementsMethod = (ISearchContext context) => new List <IWebElement>().AsReadOnly(); } else { by.findElementsMethod = (ISearchContext context) => ((IFindsElement)context).FindElements(by.mechanism, by.criteria); } return(by); }
/// <summary> /// Gets a mechanism to find elements by their name. /// </summary> /// <param name="nameToFind">The name to find.</param> /// <returns>A <see cref="By"/> object the driver can use to find the elements.</returns> public static By Name(string nameToFind) { if (nameToFind == null) { throw new ArgumentNullException("nameToFind", "Cannot find elements when name text is null."); } string selector = "*[name =\"" + By.EscapeCssSelector(nameToFind) + "\"]"; By by = new By(CssSelectorMechanism, selector); by.description = "By.Name: " + nameToFind; return(by); }
/// <summary> /// Gets a mechanism to find elements by their name. /// </summary> /// <param name="nameToFind">The name to find.</param> /// <returns>A <see cref="By"/> object the driver can use to find the elements.</returns> public static By Name(string nameToFind) { if (nameToFind == null) { throw new ArgumentNullException("nameToFind", "Cannot find elements when name text is null."); } By by = new By(); by.description = "By.Name: " + nameToFind; by.mechanism = "css selector"; by.criteria = "*[name =\"" + By.EscapeCssSelector(nameToFind) + "\"]"; by.findElementMethod = (ISearchContext context) => ((IFindsElement)context).FindElement(by.mechanism, by.criteria); by.findElementsMethod = (ISearchContext context) => ((IFindsElement)context).FindElements(by.mechanism, by.criteria); return(by); }
/// <summary> /// Gets a mechanism to find elements by their CSS class. /// </summary> /// <param name="classNameToFind">The CSS class to find.</param> /// <returns>A <see cref="By"/> object the driver can use to find the elements.</returns> /// <remarks>If an element has many classes then this will match against each of them. /// For example if the value is "one two onone", then the following values for the /// className parameter will match: "one" and "two".</remarks> public static By ClassName(string classNameToFind) { if (classNameToFind == null) { throw new ArgumentNullException(nameof(classNameToFind), "Cannot find elements when the class name expression is null."); } string selector = "." + By.EscapeCssSelector(classNameToFind); if (selector.Contains(" ")) { // Finding elements by class name with whitespace is not allowed. // However, converting the single class name to a valid CSS selector // by prepending a '.' may result in a still-valid, but incorrect // selector. Thus, we short-ciruit that behavior here. throw new InvalidSelectorException("Compound class names not allowed. Cannot have whitespace in class name. Use CSS selectors instead."); } By by = new By(CssSelectorMechanism, selector); by.description = "By.ClassName[Contains]: " + classNameToFind; return(by); }