我用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
谢谢解惑
同求解决方式