我正在尝试使用 selenium
(在 chrome
中)自动执行 Web 应用程序的登录过程。加载页面时,会出现一个弹出窗口,询问登录凭据。
我已经尝试过以下方法。
- 在
url
中传递用户名密码 - 这样不行。 - 通过我们从
chrome 开发者工具
获取的名称进行访问。 -- 弹出窗口部分没有名称。它是一个.swf
组件,其中'Allowscriptaccess'
属性设置为'sameDomain'
(我不知道这是否相关。)基本上,我所理解的弹出窗口是一个.swf
组件。
有什么方法可以访问此窗口并在 selenium
中输入登录详细信息。提前致谢。
最佳答案
直接提交表单
您可能无法在 URL 中传递用户名/密码,因为服务器端实现期望 Content-Type
为 application/x-www- form-urlencoded
、multipart/form-data
或 application/json
。
您可能需要使用类似以下内容,而不是使用https://mywebsite.com/login?username=myusername&password=mypassword
:
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: mywebsite.com
Connection: close
User-Agent: Some User Agent
Content-Length: xxx
username=myusername&password=mypassword
User-Agent
header 通常是必要的,以免在服务器端被阻止(403 Forbidden)。
实际检查此问题的一种方法是使用 Firebug 或 Chrome 开发者工具来检查登录数据如何发送到服务器并模仿该行为。
在 HTML 表单中使用 Selenium
使用 Selenium,您还可以填写表格。
如果它在新窗口/选项卡/弹出窗口中打开,您可以选择正确的窗口。假设 driver
是您正在使用的 WebDriver。
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
for (String tab : tabs) {
driver.switchTo().window(tab);
// Either get it by its url
if (driver.getCurrentUrl().equals("https://mywebsite.com/my-login") {
// Do the login
}
// Detect based on HTML on the page
if (driver.findElement(By.cssSelector(".my-form-class #my-form-id")).size() != 0) {
// Do the login
}
}
当 JavaScript 加载登录屏幕时,您可以等待该元素在 DOM 中变得可用。再次假设驱动程序是您正在使用的 WebDriver。
WebDriverWait wait = new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".my-form-class #my-form-id")));
现在您可以实际填写表格:
driver.findElement(By.cssSelector(".my-form-class .username")).sendKeys("your-actual-username");
driver.findElement(By.cssSelector(".my-form-class .password")).sendKeys("your-actual-password");
driver.findElement(By.cssSelector(".my-form-class .submit-button")).click();
编写代码来验证登录是否成功。
与 Flash 交互
如果登录是实际的 Flash 对象,您可能被迫使用 Java Robot类(class)。从而执行一系列步骤:
鼠标移动
到用户名/电子邮件字段的位置mousePress
单击表单字段keyPress
填写您的用户名
重复输入密码并提交按钮。检查登录是否确实成功。
此外,您还可以使用 conductor框架,它可以使 Selenium 测试变得更容易。
关于java - 使用 selenium 自动登录 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40740388/