我在不同的机器上使用Selenium来自动测试MVC Web应用程序。
我的问题是我无法获得每台机器的基本网址。
我可以使用以下代码获取当前网址:
IWebDriver driver = new FirefoxDriver();
string currentUrl = driver.Url;
但是当我需要导航到另一个页面时,这无济于事。
理想情况下,我可以使用以下内容导航到不同的页面:
driver.Navigate().GoToUrl(baseUrl+ "/Feedback");
driver.Navigate().GoToUrl(baseUrl+ "/Home");
我使用的可能解决方法是:
string baseUrl = currentUrl.Remove(22); //remove everything from the current url but the base url
driver.Navigate().GoToUrl(baseUrl+ "/Feedback");
我有更好的办法吗?
答案 0 :(得分:15)
解决此问题的最佳方法是创建URL的Uri
实例。
这是因为.NET中的Uri
class已经有代码完全为您完成此操作,因此您应该使用它。我会选择(未经测试的代码):
string url = driver.Url; // get the current URL (full)
Uri currentUri = new Uri(url); // create a Uri instance of it
string baseUrl = currentUri.Authority; // just get the "base" bit of the URL
driver.Navigate().GoToUrl(baseUrl + "/Feedback");
基本上,您在Uri
班级Authority property之后。
注意,有一个属性做类似的事情,称为Host,但这不包括您的网站所做的端口号。但是要记住这一点。
答案 1 :(得分:2)
抓住driver.Url
,将其投放到新System.Uri
,然后使用myUri.GetLeftPart(System.UriPartial.Authority)
。
如果您的基本网址为http://localhost:12345/Login
,则会返回http://localhost:12345
。
答案 2 :(得分:0)
尝试从此answer获取此正则表达式。
String baseUrl;
Pattern p = Pattern.compile("^(([a-zA-Z]+://)?[a-zA-Z0-9.-]+\\.[a-zA-Z]+(:\d+)?/");
Matcher m = p.matcher(str);
if (m.matches())
baseUrl = m.group(1);