我注意到,当我使用Selenium Web驱动程序与网页上的元素进行交互时,我的代码变得不可读,因为我使用了很多XPath-s来查找这些元素。例如:
driver.FindElement(By.XPath("//div[@class='login']//a[@href='#']"), Globals.TIMEOUT).Click();
var loginField = driver.FindElement(By.XPath("//div[@id='login_box']//input[@name='login_name']"));
jdriver.ExecuteScript("arguments[0].setAttribute('value', '" + login + "')", loginField);
var passwordField = driver.FindElement(By.XPath("//div[@id='login_box']//input[@name='login_password']"));
jdriver.ExecuteScript("arguments[0].setAttribute('value', '" + password + "')", passwordField);
driver.FindElement(By.XPath("//div[@id='login_box']//input[@type='submit']")).Click();
driver.FindElement(By.XPath("//div[@class='nameuser']"), Globals.TIMEOUT);
我认为我可以将 XPath 值放入常量字符串中,但在阅读代码时查看元素的实际 XPath 非常有帮助。但另一方面,当某些对象的 XPath 发生变化时,我必须在使用它的所有位置更改它。那么这个问题的最佳解决方案是什么?使用 Page factory 使用 Selenium 页面对象模型。帮助维护干净的代码并增强代码的可读性。
创建一个页面对象文件。
例如,如果您经常使用像"//div[@id='login_box']//input[@type='submit']"
这样的 xPath,请在页面对象文件中放置:
var loginSubmit = "//div[@id='login_box']//input[@type='submit']"
然后在主文件中导入页面对象文件:
using myPageObjectFile
driver.FindElement(By.XPath(myPageObjectFile.loginSubmit));
我的 C# 不是很好,所以它可能不完全是这样。但大意如此的东西应该奏效。
这样,当 xPath 更改时,您只需要在页面对象文件中对其进行调整。