首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >url是通过selenium IDE正确启动的,而不是通过脚本启动的。

url是通过selenium IDE正确启动的,而不是通过脚本启动的。
EN

Stack Overflow用户
提问于 2017-10-12 07:29:40
回答 3查看 808关注 0票数 2

我试图启动一个url,一旦加载将提示用户名和密码。

问题是,当我通过selenium记录和运行测试用例时,它可以工作。然而,当我试图通过代码启动url时,它会变成灰色,并且不会显示任何用户名和密码提示。

观察:

当我手动打开URL时

代码语言:javascript
复制
url =http://10.131.14.245:30016/index.html

它会在几秒钟内自动重定向到

代码语言:javascript
复制
http://10.131.14.245:30016/index.html#/Login

并且用户名和密码的提示看起来是可见的。

但是,在脚本执行期间,URL没有重定向它自己,它仍然是

代码语言:javascript
复制
url =http://10.131.14.245:30016/index.html

即使我们通过代码添加‘#登录’值,它也不起作用。

我使用Python2.7 Selenium 3.6 Firefox 52.4 geckodriverv.018

下面是geckodriver.log文件中的错误

代码语言:javascript
复制
1507793622480   geckodriver INFO    geckodriver 0.18.0
1507793622495   geckodriver INFO    Listening on 127.0.0.1:56485
1507793624523   geckodriver::marionette INFO    Starting browser C:\Program Files\Mozilla Firefox\firefox.exe with args ["-marionette"]
1507793626284   Marionette  INFO    Listening on port 56493
1507793626626   Marionette  WARN    TLS certificate errors will be ignored for this session
JavaScript warning: http://10.131.14.245:30016/vendor/jquery/jquery.min.js, line 1: Using //@ to indicate sourceMappingURL pragmas is deprecated. Use //# instead
JavaScript error: http://10.131.14.245:30016/vendor/requirejs/require.js, line 165: Error: Load timeout for modules: angular,ocLazyLoad,angular-ui-router,angular-translate,angular-sanitize,angular-translate-loader-static-files,angular-translate-loader-partial,angular-css-injector
http://requirejs.org/docs/errors.html#timeout
#timeout
1507793619059   addons.productaddons    WARN    Failed downloading via XHR, status: 0, reason: error
1507793619078   addons.productaddons    WARN    Failed downloading via XHR, status: 0, reason: error
[Child 12096] WARNING: pipe error: 109: file c:/builds/moz2_slave/m-esr52-w64-000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 345

下面是python中的错误

代码语言:javascript
复制
D:\userdata\khchoudh\Desktop\POC\Selenium Robotframework\Firefox>python worked2.py
EE
======================================================================
ERROR: test_worked2 (__main__.Worked2)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "worked2.py", line 21, in test_worked2
    driver.find_element_by_name("username").clear()
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 437, in find_element_by_name
    return self.find_element(by=By.NAME, value=name)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 843, in find_element
    'value': value})['value']
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 308, in execute
    self.error_handler.check_response(response)
  File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
NoSuchElementException: Message: Unable to locate element: [name="username"]

Python代码

-编码: utf-8 -

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Worked2(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://10.131.14.245:30016/index.html"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_worked2(self):
        driver = self.driver
        driver.get(self.base_url + "#/login")
        driver.find_element_by_name("username").clear()
        driver.find_element_by_name("username").send_keys("xxxx")
        driver.find_element_by_name("password").clear()
        driver.find_element_by_name("password").send_keys("xxxx")
        driver.find_element_by_xpath("//button").click()

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

网站的HTML

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title ng-bind="title">OpenDayLight DLUX</title>

    <meta name="description" content="overview &amp; stats" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script type="text/javascript">
var module = ['angular','ocLazyLoad','angular-ui-router','angular-translate', 'angular-sanitize', 'angular-translate-loader-static-files', 'angular-translate-loader-partial', 'angular-css-injector'];
var deps = ['common/config/env.module','app/testsetup/testsetup.module','app/core/core.module','app/designboard/designboard.module','app/testautomation/testautomation.module','common/login/login.module','common/authentification/auth.module','common/navigation/navigation.module','common/topbar/topbar.module','common/general/common.general.module','app/topology/topology.module','app/yangui/main','common/yangutils/yangutils.module','common/sigmatopology/sigmatopology.module','app/yangvisualizer/yangvisualizer.module','common/layout/layout.module'];
var e = ['oc.lazyLoad', 'ui.router', 'pascalprecht.translate', 'ngSanitize', 'angular.css.injector', 'app','app.testsetup','app.core','app.designboard','app.testautomation','app.common.login','app.common.auth','app.common.nav','app.common.topbar','app.common.general','app.topology','app.yangui','app.common.yangUtils','app.common.sigmatopology','app.yangvisualizer','app.common.layout'];
        // global variables

    </script>

    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->

    <!--[if lt IE 9]>
    <script src="assets/js/html5shiv.js"></script>
    <script src="assets/js/respond.min.js"></script>
    <![endif]-->

    <!-- compiled CSS -->
    <link rel="stylesheet" type="text/css" href="vendor/ng-grid/ng-grid.min.css" />
    <link rel="stylesheet" type="text/css" href="vendor/select2-bootstrap-css/select2-bootstrap.css" />
    <link rel="stylesheet" type="text/css" href="vendor/footable/css/footable.core.min.css" />
    <link rel="stylesheet" type="text/css" href="vendor/footable/css/footable.standalone.min.css" />
    <link rel="stylesheet" type="text/css" href="vendor/vis/dist/vis.min.css" />
    <link rel="stylesheet" type="text/css" href="vendor/ng-slider/dist/css/ng-slider.min.css" />
    <link rel="stylesheet" type="text/css" href="assets/opendaylight-dlux-0.2.0.css" />
    <link rel="stylesheet" href="assets/css/sb-admin.css" />

    <script type="text/javascript" data-main="src/main.js" src="vendor/requirejs/require.js"></script>

    <link rel="stylesheet" href="assets/css/font-awesome.min.css" />
    <!-- the font-awesome is different from the 'official' one -->
<link rel="stylesheet" href="src/app/testsetup/testsetup-custom.css" />
<link rel="stylesheet" href="src/app/designboard/designboard-custom.css" />
<link rel="stylesheet" href="src/app/testautomation/testautomation-custom.css" />

    <!-- application CSS -->
  </head>

  <body class="skin-3">
  <div ui-view="mainContent"></div>
  </body>
</html>
EN

回答 3

Stack Overflow用户

发布于 2017-10-12 08:35:10

在我看来,您所观察到的错误类型似乎是由于SeleniumgeckodriverFirefox版本之间的不匹配造成的。

正如发行说明所示,Selenium v3.6.0应该很适合geckodriver v.0.18.0 (推荐使用geckodriver v.0.19.0 )。

但是geckodriver v.0.18.0发行说明清楚地提到了以下几点:

geckodriver now recommends Firefox 53 and greater geckodriver compatible with Firefox 56 and greater

因此,将您的Firefox升级到v53+级别肯定会解决您的问题。

更新:

根据您的注释,您可以将username字段的定位器更改为以下任一项:

  1. css_selector driver.find_element_by_css_selector("inputname=username")
  2. xpath driver.find_element_by_xpath("//input@name='username'")
票数 1
EN

Stack Overflow用户

发布于 2017-10-14 02:30:07

您的驱动程序很可能在第一次加载后获取用户名字段,异常失败并在重定向之前关闭它。它需要等待。你可以试试:

代码语言:javascript
复制
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
...
def test_worked2(self):
    driver = self.driver
    driver.get(base_url)
    WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, 'username'))).send_keys("xxx")
票数 0
EN

Stack Overflow用户

发布于 2017-10-25 06:03:56

我能够通过使用Firefox配置文件来解决这个问题,我不知道它带来了什么不同,但它实际上起了作用。

链接以创建Firefox

Windows

下面的是代码

代码语言:javascript
复制
from selenium import webdriver
fp = webdriver.FirefoxProfile('C:/Users/<user name>/AppData/Roaming/Mozilla/Firefox/Profiles/abc3defghij2.ProfileName')
driver = webdriver.Firefox(fp)
driver.get("https://www.example.com/membersarea")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46703873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档