点击按钮并用Selenium和PhantomJS填写表格



我有一个想要自动化的简单任务。我想打开一个URL,点击一个按钮,进入下一页,填写一个搜索词,点击"搜索"按钮,打印出结果页面的URL和源代码。我写了以下内容。

from selenium import webdriver
import time
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
#open URL
driver.get("https://www.searchiqs.com/nybro/")
time.sleep(5)
#click Log In as Guest button
driver.find_element_by_id('btnGuestLogin').click()
time.sleep(5)
#insert search term into Party 1 form field and then search
driver.find_element_by_id('ContentPlaceholder1_txtName').send_keys("Moses")
driver.find_element_by_id('ContentPlaceholder1_cmdSearch').click()
time.sleep(10)
#print and source code
print driver.current_url
print driver.page_source
driver.quit()

我不确定哪里出了问题,但我已经学习了许多关于如何点击按钮和填写表格的教程。我得到了这个错误。

Traceback (most recent call last):                                                                                                                                              
  File "phant.py", line 12, in <module>                                                                                                                                         
    driver.find_element_by_id('btnGuestLogin').click()                                                                                                                          
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 269, in find_element_by_id                                                         
    return self.find_element(by=By.ID, value=id_)                                                                                                                               
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 752, in find_element                                                               
    'value': value})['value']                                                                                                                                                   
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute                                                                    
    self.error_handler.check_response(response)                                                                                                                                 
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response                                                          
    raise exception_class(message, screen, stacktrace)                                                                                                                          
selenium.common.exceptions.NoSuchElementException: Message: {"errorMessage":"Unable to find element with id 'btnGuestLogin'","request":{"headers":{"Accept":"application/json","
Accept-Encoding":"identity","Connection":"close","Content-Length":"94","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:35670","User-Agent":"Python-urllib/2.7"
},"httpVersion":"1.1","method":"POST","post":"{"using": "id", "sessionId": "d38e5fa0-5349-11e6-b0c2-758ad3d2c65e", "value": "btnGuestLogin"}","url":"/element","urlP
arsed":{"anchor":"","query":"","file":"element","directory":"/","path":"/element","relative":"/element","port":"","host":"","password":"","user":"","userInfo":"","authority":""
,"protocol":"","source":"/element","queryKey":{},"chunks":["element"]},"urlOriginal":"/session/d38e5fa0-5349-11e6-b0c2-758ad3d2c65e/element"}}                                  
Screenshot: available via screen

该错误似乎表明具有该id的元素不存在,但它确实存在。

---EDIT:更改代码以使用WebDriverWait-

我已经改变了一些事情来实现WebDriverWait

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
#open URL
driver.get("https://www.searchiqs.com/nybro/")
#click Log In as Guest button
element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "btnGuestLogin"))
        )
element.click()
#wait for new page to load, fill in form and hit search
element2 = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "ContentPlaceholder1_cmdSearch"))
        )
#insert search term into Party 1 form field and then search
driver.find_element_by_id('ContentPlaceholder1_txtName').send_keys("Moses")
element2.click()
driver.implicitly_wait(10)
#print and source code
print driver.current_url
print driver.page_source
driver.quit()

它仍然会引发这个错误

Traceback (most recent call last):                                                                                                                                              
  File "phant.py", line 14, in <module>                                                                                                                                         
    EC.presence_of_element_located((By.ID, "btnGuestLogin"))                                                                                                                    
  File "/usr/local/lib/python2.7/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

WebDriverWait方法实际上对我有效,如下所示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get("https://www.searchiqs.com/nybro/")
element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "btnGuestLogin"))
        )
element.click()

没有错误。PhantomJS 2.1.1版、Selenium 2.53.6版、Python 2.7版。


该问题可能与SSL和PhantomJS有关,或者通过http:工作

driver.get("http://www.searchiqs.com/nybro/")

或者,尝试忽略SSL错误:

driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any'])

最新更新