【问题标题】:Selenium with pyvirtualdisplay unable to locate elementSelenium with pyvirtualdisplay 无法定位元素
【发布时间】:2013-12-10 03:16:43
【问题描述】:

我有一个使用 selenium 登录网站的工作脚本,如下所示:

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

通过sshamazon ubuntu 盒子 上运行该脚本,我在其中安装了 firefox,方法如下: sudo apt-get install firefox

我得到的错误是:

selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"id","selector":"content"}'

如果我也通过ssh 在另一个 ubuntu 机器上运行相同的脚本,它运行良好,没有错误,但我不知道该机器上是如何安装 firefox 的,可能是什么原因导致该错误。是相关的firefox安装以及如何正确安装它以与pyvirtualdisplay和selenium一起使用?

【问题讨论】:

  • 我觉得你不需要self,只需要browser.find_element_by_id('content')
  • @AlexanderPetrovich 是的,谢谢,这是示例中的错误。
  • 到目前为止,您找到解决方案了吗?这篇文章对您有帮助吗?如果没有,请发表另一条评论。

标签: python ubuntu selenium pyvirtualdisplay


【解决方案1】:

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

检查配置

  • 您是否为pyvirtualdisplay 安装了后端,例如xvfbxephyr? 如果没有,

    试试: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) 添加到您的 Selenium 网络驱动程序。

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

【讨论】:

  • 如果两个版本都失败 - 请添加我可以直接测试的确切网址。
  • 看起来像安装xserver-xephyr 一样,但问题似乎是我的盒子速度很慢,我能够将它部署到另一个盒子。谢谢!
【解决方案2】:
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()

【讨论】:

  • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
猜你喜欢
  • 2016-12-05
  • 2022-01-06
  • 2021-06-21
  • 1970-01-01
  • 2017-11-27
  • 2018-07-06
相关资源
最近更新 更多