我有一个问题,正在使用的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)
有什么想法吗?
答案 0 :(得分:0)
您可以将部分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"));
答案 1 :(得分:0)
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
开头,后跟动态值,因此您可以使用 ^
来表示开始于 -id-cell-
,因此您可以使用*
来表示包含 但是,由于所需元素是动态元素,因此要在元素上调用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();
答案 2 :(得分:0)
很抱歉给您这个消息,但是xpath 1.0在大多数驱动程序中仍然使用...相当:
正如其他答案所指出的那样,XPath 1.0不支持常规 表达式。
建议的方法是使用父元素来定位您想要单击的元素。
或..
如果grid-xxx--xxx--
id关键字是常量,则可以执行类似的操作
Xpath://*[starts-with(@id, 'Grid')]/a
-id以Grid开头
CSS:input[id^='Grid'] > a
-id以Grid开头
将输入更改为实际的Web元素。