2013-12-10 73 views
4

我有一个工作脚本使用硒这样登录到一个网站:硒与pyvirtualdisplay无法找到元素

script.py

from pyvirtualdisplay import Display 
from selenium import webdriver 

display = Display(visible=0, size=(1024, 768)) 
display.start() 

browser = webdriver.Firefox() 
actions = webdriver.ActionChains(browser) 
browser.get('some_url_I_need') 
content = browser.find_element_by_id('content') # Error on this line 

运行该脚本上亚马逊Ubuntu的盒子ssh我在那里安装firefox的方式如下: sudo apt-get install firefox

我得到的错误是:

selenium.common.exceptions.NoSuchElementException:消息:u'Unable定位元件:{ “方法”: “ID”, “选择器”: “内容”}”

如果我运行通过ssh也在另一个Ubuntu的盒子上的脚本,它运行良好,没有错误,但我不知道如何在该框上安装Firefox,可能是该错误的原因。是相关的Firefox安装和如何正确安装它与pyvirtualdisplay和硒一起使用?

+0

我觉得你不需要'self',只是'browser.find_element_by_id( '内容')' –

+0

@AlexanderPetrovich是的,谢谢,这是对的例子是错误的。 – PepperoniPizza

+0

您目前是否找到解决方案?这篇文章是否帮助你 - 如果不是,请发表另一条评论。 – Jon

回答

10

如果网站上有一些动态内容,您需要等待一段时间 ,直到您可以检索到希望的元素。尝试下面的代码示例:

检查配置

  • 是否安装了pyvirtualdisplayxvfbxephyr后端? 如果没有,

    尝试:sudo apt-get install xvfb xserver-xephyr

首先尝试:添加一个简单的time.sleep()

import time 
from pyvirtualdisplay import Display 
from selenium import webdriver 

display = Display(visible=0, size=(1024, 768)) 
display.start() 

browser = webdriver.Firefox() 
actions = webdriver.ActionChains(browser) 
browser.get('some_url_I_need') 
time.sleep(5) # sleep for 5 seconds 
content = browser.find_element_by_id('content') # Error on this line 

第二个尝试:添加browser.implicitly_wait(30)您硒的webdriver。

from pyvirtualdisplay import Display 
from selenium import webdriver 

display = Display(visible=0, size=(1024, 768)) 
display.start() 

browser = webdriver.Firefox() 
browser.implicitly_wait(30) # seconds 
actions = webdriver.ActionChains(browser) 
browser.get('some_url_I_need') 
content = browser.find_element_by_id('content') # Error on this line 
+0

如果两个版本都失败 - 请添加我可以直接测试的确切网址。 – Jon

+1

看起来像安装'xserver-xephyr'这样做,仍然问题似乎是我的盒子慢,我能够部署到另一个盒子。谢谢 ! – PepperoniPizza

0
from pyvirtualdisplay import Display 

from selenium import webdriver 

from selenium.webdriver.common.by import By 

from selenium.webdriver.support.ui import Select 

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 

from selenium.common.exceptions import NoSuchElementException 

from selenium.common.exceptions import NoAlertPresentException 

from selenium.webdriver.common.keys import Keys 

import unittest, time, re, random 

capabilities = DesiredCapabilities.FIREFOX.copy() 

capabilities['marionette'] = False 

#display = Display(visible=0, size=(1024, 768)) 
#display.start() 

driver = webdriver.Firefox(capabilities=capabilities) 

driver.implicitly_wait(20) 

base_url = "http://xxx.yyy.zzz.aaa/sss/sss-Login/login/main_login.php" 

RANDINT = random.random()*10000 

verificationErrors = [] 

driver.get(base_url + "") 

username = driver.find_element_by_id("myusername") 

username.send_keys("xxxxxxxx") 

driver.implicitly_wait(20) 

password = driver.find_element_by_id("mypassword") 

#password.send_keys("xxxxzz" + Keys.ENTER) 

password.send_keys("xxxxzzc") 

driver.implicitly_wait(20) 

driver.find_element_by_xpath("//*[@id='submit']").click() 


# Click on category link 


driver.find_element_by_xpath("//*[@id='stylefour']/ul/li[3]/a").click() 

driver.find_element_by_xpath("//*[@id='stylefour']/ul/li[1]/a").click() 

driver.find_element_by_xpath("//*[@id='stylefour']/ul[2]/li[4]/a").click 

# Click on sub-category link 

driver.find_element_by_xpath("//*[@id='top']/body/div/div[2]/div[2]/div/div[2]/ul/li[4]/a/span").click() 

# Click on product image 

driver.find_element_by_xpath("//*[@id='product-collection-image-374']").click() 

# Click Checkout button 

driver.find_element_by_xpath("//*[@id='checkout-button']/span/span").click() 

driver.find_element_by_id("billing:firstname").clear() 

driver.find_element_by_id("billing:firstname").send_keys("selenium", RANDINT, "_fname") 

driver.find_element_by_id("billing:lastname").clear() 

driver.find_element_by_id("billing:lastname").send_keys("selenium", RANDINT, "_lname") 

# Click Place Order 

driver.find_element_by_xpath("//*[@id='order_submit_button']").click() 



driver.quit() 

display.stop() 
+2

欢迎来到Stack Overflow!尽管这段代码可以解决这个问题,但[包括一个解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – Machavity