以下代码在IE,FireFox,Chrome中执行完美。在PhantomJS中,似乎它不会在这种情况下等待,因为弹出窗口(通过div上的CSS样式)来显示。如果我在发生异常的语句之前放置一个sleep语句,问题就会消失。为什么driver.ImplicitlyWait()不起作用?我不应该在睡觉时乱丢我的代码而应该和Phantom一起等待吗?
我看过很多帖子,但似乎都没有解决我的问题。关于我可以尝试的任何想法?
我尝试过的事实和事情...... - 整个源代码中只有一个id ='firstname'的元素 - 无论浏览器如何,始终可以找到此元素,这是一个可互动的问题 - 此元素始终可以在ff,chrome中进行交互,即没有WebDriverWait - 除非使用WebDriverWait,否则此元素在幻像中永远不可交互 - 设置driver.Manage()。Window.size为Maximum或1920,1080不能解决问题 - 尝试不同的选择器,例如By.CssSelector(“input#firstname”)和By.XPath(“// div [@ class ='modal-body'] //输入[@ id ='firstname']”)导致同样的例外。
// successful code
IWebDriver driver = new PhantomJSDriver();
driver.Manage().Window.Size = new System.Drawing.Size(1920, 1080);
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
driver.Navigate().GoToUrl(home_page);
driver.FindElement(By.Id("btnAddEmployee")).Click();
// exception here
driver.FindElement(By.Id("firstname")).SendKeys("first name");
//例外
OpenQA.Selenium.InvalidElementStateException:{“errorMessage”:“元素当前不可交互,可能无法操作”,“请求”:{“headers”:{“Accept”:“application / json,image / png”,“Connection” “:” 关闭 “ ”内容长度“: ”19“, ”内容类型“: ”应用/ JSON;字符集= UTF-8“, ”主机“: ”本地主机:20943“}, ”httpVersion“:” 1.1" , “方法”: “POST”, “后”: “{\” 值\ “:[\” 爱丽丝\ “]}”, “URL”: “/值”, “urlParsed”:{ “锚” : “”, “查询”: “”, “文件”: “值”, “目录”: “/”, “路径”: “/值”, “相对的”: “/值”, “端口”:” “ ”宿主“: ”“, ”密码“: ”“, ”用户“: ”“, ”用户信息“: ”“, ”权威“: ”“, ”协议“: ”“, ”源“:”/值”, “queryKey”:{}, “块”:[ “值”]} “urlOriginal”: “/会话/ 5c641300-a229-11e6-9fa8-69dbd56d6ff7 /元件/:WDC:1478220923048 /值”}}
结果标准输出:
无法连接到远程服务器
OpenQA.Selenium.InvalidElementStateException:{“errorMessage”:“元素当前不可交互,可能无法操作”,“请求”:{“headers”:{“Accept”:“application / json,image / png”,“Connection” “:” 关闭 “ ”内容长度“: ”19“, ”内容类型“: ”应用/ JSON;字符集= UTF-8“, ”主机“: ”本地主机:20943“}, ”httpVersion“:” 1.1" , “方法”: “POST”, “后”: “{\” 值\ “:[\” 爱丽丝\ “]}”, “URL”: “/值”, “urlParsed”:{ “锚” : “”, “查询”: “”, “文件”: “值”, “目录”: “/”, “路径”: “/值”, “相对的”: “/值”, “端口”:” “ ”宿主“: ”“, ”密码“: ”“, ”用户“: ”“, ”用户信息“: ”“, ”权威“: ”“, ”协议“: ”“, ”源“:”/值”, “queryKey”:{}, “块”:[ “值”]} “urlOriginal”: “/会话/ 5c641300-a229-11e6-9fa8-69dbd56d6ff7 /元件/:WDC:1478220923048 /值”}}
在OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
在OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute,Dictionary`2参数)
在OpenQA.Selenium.Remote.RemoteWebElement.SendKeys(String text)
在C:\ Users \ User \ Documents \ Visual Studio 2015 \ Projects \ Test \ Project \ TestCases.cs中的Test.TestCases.Test():第191行
// web page source code being automated
<!DOCTYPE html><html lang="en"><head>
<title>Benefits Dashboard</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/pagePuncher.css">
<link href="https://fonts.googleapis.com/css?family=Merriweather+Sans:300" rel="stylesheet" type="text/css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js">
</script>
<script src="http://fgnass.github.io/spin.js/spin.min.js"></script><style type="text/css"></style>
<script src="assets/js/employee.js"></script>
<script src="assets/js/scripts.js"></script>
<script>
function GetURLParameter(r){for(var t=window.location.search.substring(1),e=t.split("&"),n=0;n<e.length;n++){var a=e[n].split("=");if(a[0]==r)return a[1]}return""}""==GetURLParameter("username")&&(window.location.href="login.html");
</script>
</head>
<body class="modal-open">
<div id="uselessBlueHeader"></div>
<div class="container">
<div id="header" class="page-header jumbotron">
<h1>Benefits Dashboard</h1>
</div>
<div id="data">
<div class="table-responsive">
<table class="table table-striped table-hover" id="employee-table" style="margin-bottom: 5px;">
<thead>
<tr>
<th>ID</th>
<th>Last Name</th>
<th>First Name</th>
<th>Salary</th>
<th>Dependents</th>
<th>Gross Pay
</th><th>Benefit Cost</th>
<th>Net Pay</th>
<th>Actions</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<button id="btnAddEmployee" type="button" class="btn btn-primary" data-toggle="modal" data-target="#addEmployeeModal">Add Employee</button>
<div class="modal fade in" id="addEmployeeModal" role="dialog" style="display: block;">
<div class="modal-dialog modal-lg">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Add Employee & His dependents</h4>
</div>
<div class="modal-body">
<form class="form-horizontal" role="form" id="employees-form" onsubmit="return validateForm()">
<div class="form-group">
<label class="control-label col-sm-2" for="firstname">First Name:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="firstname">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="lastname">Last Name:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="lastname">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="dependents">Dependants:</label>
<div class="col-xs-1">
<input type="text" class="form-control" id="dependents">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-primary" data-dismiss="modal" id="addEmployee">Submit</button>
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="modal-backdrop fade in"></div></body></html>
答案 0 :(得分:0)
使用隐式等待直到元素在dom中可见,并且不检查其他交互(例如元素状态)。即,在这行代码中
driver.FindElement(By.Id("firstname")).click()
隐式等待仅等待出现id="firstname"
的元素,并且一旦出现,脚本将尝试单击它。但是,该元素可能不是可点击的&#34;。行为可能因多种因素而异,这可能是您在浏览器中遇到不稳定执行的原因。
要实现这一点,您必须特别等到元素可点击。你可以使用这样的东西:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("firstname")));
注意 1.不要在代码中混合使用隐式和显式等待语句。 2.如果要使用稳定的脚本,正确的同步是一个重要因素。同步不仅仅是添加等待语句。 3.使用Sleep语句乱丢代码并不是一种好的编码实践,理想情况下不应该使用它,除非您只是尝试调试脚本。
其他详细信息
我怀疑其他浏览器和phantomjs之间的区别在于底层的浏览器引擎。例如,Phantomjs使用WebKit
,Chrome使用Blink
。
在每次操作之前,您不必使用显式等待。在一个动作导致额外的Dom元素加载或导致导航之后。