我的目标是使用Selenium for Python自动化在线账单支付。
使用带有此代码的Webdriver成功登录:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://website.com/Home')
emailElem = browser.find_element_by_id('UserName') #finds login username field
emailElem.send_keys('username') #enter the username
passwordElem = browser.find_element_by_id('UserPassword') #finds pw field
passwordElem.send_keys('password') #enters pw
passwordElem.submit() #presses submit button
登录后,会加载新页面,我的下一步是点击链接。代码:
browser.implicitly_wait(3) #allow new page to load (also tried 5 seconds)
click_link = browser.find_element_by_link_text("Bill & Payment")
click_link.click()
没有任何反应。没有导航到比尔&amp;付款页面。实际链接中包含<BR>
标记,因此我也尝试添加标记:
click_link = browser.find_element_by_link_text("Bill &<BR>Payment")
但仍然没有。我还应该尝试一些其他的事情吗?
错误:
追踪(最近一次通话): 文件“/home/captain/.PyCharmEdu30/config/scratches/scratch_1.py”,第12行,in click_link = browser.find_element_by_link_text(“比尔和付款”)#点击下一页的链接
文件“/home/captain/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py”,第317行,在find_element_by_link_text中 return self.find_element(by = By.LINK_TEXT,value = link_text)
文件“/home/captain/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py”,第752行,在find_element中 'value':value})['value']
文件“/home/captain/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py”,第236行,执行 self.error_handler.check_response(响应)
文件“/home/captain/.local/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py”,第192行,在check_response中 提出exception_class(消息,屏幕,堆栈跟踪) selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:{“method”:“link text”,“selector”:“Bill&amp; Payment”}
堆栈跟踪: 在FirefoxDriver.prototype.findElementInternal_(文件:///tmp/tmps7uj9u0l/extensions/fxdriver@googlecode.com/components/driver-component.js:10770) at fxdriver.Timer.prototype.setTimeout /&lt; .notify(file:///tmp/tmps7uj9u0l/extensions/fxdriver@googlecode.com/components/driver-component.js:625)
答案 0 :(得分:1)
您遇到的错误是您要查找的元素不在页面中。根据我对Selenium的经验,我发现css selectors通常最适合与网站互动。您还可以从命令行运行python,以通过以下方式测试元素是否具有良好的钩子值:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://website.com/Home')
element = "what you want to test here"
driver.find_element_by_id(element).click()
只要保持python解释器打开,你就可以不断更改元素的值并运行这些行。
如果问题似乎是Selenium没有等待足够的时间来加载页面,你总是可以尝试等待方法:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
time = 10 # Wait for 10 seconds
by = By.CSS_SELECTOR # The type of hook the element is
hook = "css.selector.here" # The value for the hook (could also be xpath, name, id, etc.)
# Waits until either the element specified by variables by and hook is
# In the page, or the value of time seconds has passed.
WebDriverWait(self.driver, time).until(ec.presence_of_element_located((by, hook)))
driver.find_element(by, hook).click()
答案 1 :(得分:1)
文档对我来说通常太技术化了,但对Selenium Python Bindings来说非常简单。
因为链接文本中有一些格式,我使用了部分链接文本方法并且它有效。
来自the documentation的例子:
continue_link = driver.find_element_by_partial_link_text('Conti')
答案 2 :(得分:0)
尝试使用
click_link = driver.find_element_by_xpath(例如&x 39;在线账单支付&#39;链接)
click_link.click()