使用PhantomJS 2.1.1 / Webdriver 2.53.0和Visual Studio / C#

时间:2016-11-04 01:31:10

标签: selenium-webdriver phantomjs

以下代码在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行

//例外截图 exception screenshot

// 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 &amp; 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>

1 个答案:

答案 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元素加载或导致导航之后。