【问题标题】:Selenium test works in local machine, but fails on JenkinsSelenium 测试在本地机器上工作,但在 Jenkins 上失败
【发布时间】:2016-01-07 00:20:08
【问题描述】:

我的测试在我的机器上运行良好。但是,在 Jenkins 上,我有以下错误:

Traceback (most recent call last):
  File "/var/lib/jenkins/jobs/twist-press-ricardo-fork/workspace/.env/local/lib/python2.7/site-packages/django/test/utils.py", line 216, in inner
    return test_func(*args, **kwargs)
  File "/var/lib/jenkins/jobs/twist-press-ricardo-fork/workspace/twist/tests/interface/test_hello.py", line 42, in test_login
    open_login_modal_btn.click()
  File "/var/lib/jenkins/jobs/twist-press-ricardo-fork/workspace/.env/local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 75, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/var/lib/jenkins/jobs/twist-press-ricardo-fork/workspace/.env/local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 454, in _execute
    return self._parent.execute(command, params)
  File "/var/lib/jenkins/jobs/twist-press-ricardo-fork/workspace/.env/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "/var/lib/jenkins/jobs/twist-press-ricardo-fork/workspace/.env/local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 181, in check_response
    raise exception_class(message, screen, stacktrace)
ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
Stacktrace:
    at fxdriver.preconditions.visible (file:///tmp/tmpl_3zEO/extensions/fxdriver@googlecode.com/components/command-processor.js:9981)
    at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmpl_3zEO/extensions/fxdriver@googlecode.com/components/command-processor.js:12517)
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpl_3zEO/extensions/fxdriver@googlecode.com/components/command-processor.js:12534)
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpl_3zEO/extensions/fxdriver@googlecode.com/components/command-processor.js:12539)
    at DelayedCommand.prototype.execute/< (file:///tmp/tmpl_3zEO/extensions/fxdriver@googlecode.com/components/command-processor.js:12481)

我安装的依赖项如下:

$ sudo apt-get install xvfb python-pip
$ sudo pip install pyvirtualdisplay

这是我的测试代码:

class MySeleniumTests(LiveServerTestCase):
    fixtures = ['user-data.json']

    def setUp(self):
        self.display = Display(visible=0, size=(800, 600))
        self.display.start()
        group = Group.objects.get_or_create(name="Test")[0]
        user_adm = User.objects.create(username="adm",
                                        is_active=True,
                                        is_staff=True,
                                        is_superuser=True)
        user_adm.set_password("123")
        user_adm.groups.add(group)
        user_adm.save()
        self.selenium.get('%s' % (self.live_server_url))
        self.browser = self.selenium

    def tearDown(self):
        self.display.stop()

    @classmethod
    def setUpClass(cls):
        super(MySeleniumTests, cls).setUpClass()
        cls.selenium = WebDriver()

    @classmethod
    def tearDownClass(cls):
        cls.selenium.quit()
        super(MySeleniumTests, cls).tearDownClass()

    @override_settings(DEBUG=True)
    def test_login(self):
        open_login_modal_btn = self.browser.find_element_by_xpath("//a[@class='btn btn-nav']")
        open_login_modal_btn.click()
        # Login info
        username_html_id = "lm-email"
        password_html_id = "lm-password"
        login_value = "adm"
        password_value = "123"
        username = self.browser.find_element_by_id(username_html_id)
        password = self.browser.find_element_by_id(password_html_id)
        # Sending login info
        username.send_keys(login_value)
        password.send_keys(password_value)
        desired_url = self.live_server_url + "/panel/"
        form = self.browser.find_element_by_xpath('//form[@id="login-modal"]')
        form.submit()
        time.sleep(5)
        # Testing if successful login
        # Logging in
        current_url = self.browser.current_url
        self.assertEqual(current_url, desired_url)

是否有任何关于如何修复它的线索?任何有关如何调试/修复它的帮助将不胜感激! :-)

-- 编辑:

我的问题已经解决了,如果你也遇到类似的问题,看看:WebDriver click() vs JavaScript click()我的问题就是这样。

【问题讨论】:

    标签: python selenium jenkins


    【解决方案1】:

    Waiting for element to be visible or clickable 通常有助于克服以下问题:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(self.browser, 10)
    open_login_modal_btn = wait.until(
        EC.element_to_be_clickable((By.XPATH, "//a[@class='btn btn-nav']"))
    )
    open_login_modal_btn.click()
    

    如果这没有帮助,可以尝试以下方法:

    • 点击前元素的scroll into view

      open_login_modal_btn = self.browser.find_element_by_xpath("//a[@class='btn btn-nav']")
      self.browser.execute_script("arguments[0].scrollIntoView();", open_login_modal_btn)
      
    • 通过Browser Actions移动到元素并点击

      actions = ActionChains(self.browser)
      actions.move_to_element(open_login_modal_btn).click().perform()
      
    • 最大化浏览器窗口在测试开始时:

      self.browser.maximize_window()
      
    • 点击通过 JavaScript (WebDriver click() vs JavaScript click()):

      self.browser.execute_script("arguments[0].click();", open_login_modal_btn)
      

    【讨论】:

    • 按照您的原始答案给我带来了 TimeoutException。我会尝试你的替代方案。无论如何,感谢您的洞察力。
    • 另外我想提一下,即使在本地浏览器仍然可以打开。我不希望它发生。
    • 所以,通过 JavaScript 点击就可以了。非常感谢。不过,也许您有任何想法来证明它的合理性?
    • @RicardoSilveira 当然,我经常看到这对其他人有帮助,很好奇为什么 - 结果如下:stackoverflow.com/questions/34562061/…
    • 其实我错了...这就是 PhantomJS dzone.com/articles/python-testing-phantomjs
    猜你喜欢
    • 2016-10-07
    • 2015-03-12
    • 1970-01-01
    • 2018-04-15
    • 2015-03-26
    • 2017-03-04
    • 2019-05-12
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多