我有一个问题,我正在使用的CssSelector的GUID每次都会更改,因此测试只能通过一次。我可以在CssSelector中使用通配符来帮助我解决这个问题吗?考虑下面的代码...
IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("# Grid365e0689-dccb-695f-97af-dc29187d4e1d-id-cell-0-7 > a"));
PersonalPhone.Click();
我希望上面的代码使用通配符通过CssSelector定位元素,以便我可以删除选择器的GUID部分,仅根据最后一部分'id-cell-0-7'找到元素,然后单击元素。
我正在使用用C#编写的Selenium WebDriver(Chrome)
有什么想法吗?
您可以将部分id
与包含*=
一起使用
IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id*='id-cell-0-7'] > a"));
或以$=
结尾
IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id$='id-cell-0-7'] > a"));
很抱歉给您这个消息,但是xpath 1.0在大多数驱动程序中仍在使用...相当:
正如其他答案所指出的那样,XPath 1.0不支持常规表达式。
建议的方法是使用父元素来定位您想要单击的元素。
..如果grid-xxx--xxx--
id关键字是常量,则可以执行以下操作:
Xpath://*[starts-with(@id, 'Grid')]/a
-ID以网格开头
CSS:input[id^='Grid'] > a
-ID以网格开头
将input更改为实际的Web元素。
id
属性的值在我看来是动态的,因此,可以选择使用以下css-selectors:
IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a"));
PersonalPhone.Click();
优化一行中的代码行:
Driver.driver.FindElement(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a")).Click();
id
属性:
Grid
开头,后跟动态值,因此您可以使用^
表示starts-with-id-cell-
在后端,因此您可以使用*
表示contains但是,由于所需元素是动态元素,因此要在元素上调用click()
,您可能必须为ElementToBeClickable()
引入WebDriverWait,并且可以使用以下Locator Strategies中的任何一个:
CssSelector
:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a"))).Click();
XPath
:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[starts-with(@id, 'Grid') and contains(@id, '-id-cell-')]/a"))).Click();