selenium配合chrome或者phantomjs效果不一样

我用selenium+chrome模拟登录和post文章的时候,没有报错,成功了,但是把chrome换成phantomjs就报错:

phantomjs://platform/console++.js:263 in error
~ |386 [ERROR - 2017-10-29T05:13:33.920Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1509254013911

完整代码如下:

#!/usr/bin/python3
# -*- coding=utf-8 -*-
# author:覃有义
#
# 模拟注册模拟登录 post一个bug
# 获取https://community.nodebb.org/tags/nodebb一百个post的标题 时间 观看次数
#
# 您好!我想问问为什么模拟访问这个网站的时候速度很慢呢?连接不稳定,非常疑惑。。本来想用国外代理试试 但是我ss不知道怎么用 中午查看邮件 吃饭去了,谢谢~
#
import logging
import time
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
SERVICE_ARGS = [
    '--load-images=false', '--disk-cache=true'      # 配置,开启缓存 关闭加载图片
]

# 针对phantomjs
browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
browser.set_window_size(1400, 900)  # 设置屏幕尺寸

# 针对有界面浏览器
# browser = webdriver.Chrome()


def register():
    browser.get(url='https://community.nodebb.org/register')
    
    try:
        # 等待加载完成,不过感觉会拖慢速度
        email = WebDriverWait(browser, 5).until(
            EC.presence_of_element_located((By.ID, 'email'))
        )
        username = WebDriverWait(browser, 5).until(
            EC.presence_of_element_located((By.ID, 'username'))
        )
        password = WebDriverWait(browser, 5).until(
            EC.presence_of_element_located((By.ID, 'password'))
        )
        confirm_password = WebDriverWait(browser, 5).until(
            EC.presence_of_element_located((By.ID, 'password-confirm'))
        )
        registration_question = WebDriverWait(browser, 5).until(
            EC.presence_of_element_located((By.ID, 'registration-question'))
        )
        submit = WebDriverWait(browser, 5).until(
            EC.element_to_be_clickable((By.ID, 'register'))
        )

        # 机器人检查
        try:
            robot_check = browser.find_elements_by_css_selector('#recaptcha-anchor > div.recaptcha-checkbox-checkmark')
            robot_check.click()
        except Exception:
            pass

        # 输入注册信息并且提交
        email.send_keys('rivenqinyy@gmail.com')
        username.send_keys('rivenqinyy')
        password.send_keys('pass1234')
        confirm_password.send_keys('pass1234')
        registration_question.send_keys('4')
        submit.click()
        
    except TimeoutException:
        logging.warning('Timeout')

    finally:
        # 我的电脑测试超级慢
        time.sleep(3)


def login(name='rivenqinyy@gmail.com', passwd='pass1234'):
    browser.get(url='https://community.nodebb.org/login')
    try:
        # 测试的时候加载太慢了
        logging.debug('登录中')

        username = WebDriverWait(browser, 5).until(
            EC.presence_of_element_located((By.ID, 'username'))
        )
        password = WebDriverWait(browser, 5).until(
            EC.presence_of_element_located((By.ID, 'password'))
        )
        # login_button = WebDriverWait(browser, 5).until(
        #     EC.presence_of_element_located((By.ID, 'login'))
        # )
        login_button = browser.find_element_by_id('login')
        # browser.execute_script('window.stop()')
        username.send_keys(name)
        password.send_keys(passwd)
        login_button.click()

    except TimeoutException:
        logging.warning('Timeout')
        return login(name, passwd)
    finally:
        logging.debug('登录成功,转其他页面')


def post_bug():
    logging.debug('Post bug:')
    browser.get(url='https://community.nodebb.org/tags/bug')

    # 测试的时候出现需要确认登录的情况
    try:
        browser.refresh()   # 刷新
        print('刷新提交bug页面')
    except TimeoutException:
        browser.get(url='https://community.nodebb.org/tags/bug')
        print('超时重新获取bug页面')

    # 等待加载
    new_topic = WebDriverWait(browser, 5).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'div .pull-right'))
    )
    new_topic.click()
    time.sleep(3)
    print('获取新建提交按钮')

    bug_title = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'div .title-container input.form-control'))
    )
    bug_text = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'div .write'))
    )
    bug_submit = WebDriverWait(browser, 5).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '.btn-group  .composer-submit'))
    )

    bug_text.send_keys('When I move the mouse to my head, the mouse can not move.')
    bug_title.send_keys('The mouse can not move')

    # 提交bug
    bug_submit.click()
    time.sleep(2)


def get_data():
    logging.debug('获取数据中')
    # 定义数据与次数
    data = {}
    a = 1
    browser.get('https://community.nodebb.org/tags/nodebb')
    try:
        browser.refresh()
    except TimeoutException:
        logging.warning('Timeout ')
        browser.get('https://community.nodebb.org/tags/nodebb')

    # 模拟鼠标拉到底部的操作脚本 本来测试用Keys.PageDown 现在换了

    # 这个是针对带界面浏览器
    # js = "var q=document.documentElement.scrollTop=10000"

    # 这个是针对phantomjs
    js = "var q = document.body.scrollTop=10000"
    # 拉13次
    try:
        for i in range(10):
            browser.execute_script(js)
            time.sleep(3)
    except TimeoutException:
        logging.warning('超时')
    # 将ajax发送过来的数据生成的内容转化为源码
    doc = pq(browser.page_source)
    data_lists = doc('div.category ul li')
    # 遍历解析数据
    for data_list in data_lists.items():
        data_title = data_list('h2>a').text()
        data_time = data_list('h2 > small.hidden-xs > span').text()
        data_views = data_list('.stats span').filter('.human-readable-number').text().split()[1]
        data[str(a)] = [data_title, data_time, data_views]
        # 输出结果 也可以保存 数据在data中
        print(str(a) + ':' + str([data_title, data_time, data_views]))
        a = int(a) + 1
        if a == 101:
            break
    return None


def main():
    # register()
    login()
    # get_data()
    post_bug()


if __name__ == '__main__':
    main()

ide报错如下

  File "/home/qinyouyi/PycharmProjects/demoOfWork/demo.py", line 126, in post_bug
    EC.presence_of_element_located((By.CSS_SELECTOR, 'div .title-container input.form-control'))
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 
Screenshot: available via screen

谢谢解惑

阅读 5.1k
2 个回答

同求解决方式

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题