Locates an element containing a text inside. Either CSS or XPath locator can be passed, however they will be converted to XPath.
from wasd.util import Locator
Locator.contains("div.foo", "Hello, World!")
>>> "descendant-or-self::div[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')][contains(., 'Hello, World!')]"
Locator.contains("//*[@data-id = 'foo']/ancestor::*", "Hello, World!")
>>> "//*[@data-id = 'foo']/ancestor::*[contains(., 'Hello, World!')]"
Locator.contains("div#foo", "goodbye", "and", "farewell")
>>> "descendant-or-self::div[@id = 'foo'][contains(., 'goodbye')][contains(., 'and')][contains(., 'farewell')]"
Locator.equal("div#foo", "Hello, World!")
>>> "descendant-or-self::div[@id = 'foo'][.= 'Hello, World!']"
Locates element at position. If a negative value is provided, counting starts from the last element. First element has index 1.
Locator.element_at("ul > li", 5)
>>> '(descendant-or-self::ul/li)[position()=5]'
Locator.element_at("ul > li", -2)
>>> '(descendant-or-self::ul/li)[position()=last()-1]'
Converts CSS to XPath.
Locator.to_xpath("p + a")
>>> "descendant-or-self::p/following-sibling::*[name() = 'a' and (position() = 1)]"
Checks that locator is an XPath.
Locator.is_xpath("//div[@id]")
>>> True
Locator.is_xpath("[id = 'foo']")
>>> False
Checks that provided string is CSS selector.
Locator.is_css("[id = 'foo']")
>>> True
Locator.is_css("//div[@id]")
>>> False