我在Python运行代码时点击Chromedriver时遇到了一个问题。此代码用于脚本:
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
driver.get("https://www.marktplaats.nl/")
cook_button = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.XPATH, "//form[@method='post']/input[@type='submit']"))).click()
它只是超时给出“NoSuchElementException”。但是,如果我将这些行手动放入Shell中,它会像往常一样点击。对于它的价值,我使用的是最新的2.40 Chromedriver和Chrome v67。无头运行并没有任何区别。
的修改
当第三个命令尝试查找因为点击未完成而不存在的元素时,程序实际上会中断
driver.get(master_link) # get the first page
wait_by_class("search-results-table")
page_2_el = driver.find_element_by_xpath("//span[@id='pagination-pages']/a[contains(@data-ga-track-event, 'gination')]")
所以,page_2_el命令给出了这个异常,但只是因为之前的点击没有成功完成以删除有关cookie的警告。
我确定xpath搜索是好的,因为它运行在Firefox中使用geckodriver,但不会在这里使用Chromedriver。
EDIT2
请在此处查看此处的错误视频https://streamable.com/tv7w4
请注意它有点退缩,看看它何时在控制台上“点击前”和“点击后” “
的解
代替
cook_button = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.XPATH, "//form[@method='post']/input[@type='submit']"))).click()
N_click_attempts = 0
while 1:
if N_click_attempts == 10:
print "Something is wrong. "
break
print "Try to click."
N_click_attempts = N_click_attempts+1
try:
cook_button = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.XPATH, "//form[@method='post']/input[@type='submit']"))).click()
time.sleep(2.0)
except:
time.sleep(2.0)
break
似乎点击现已完成。我在脚本中有其他点击,并且它们可以正常使用element.click(),由于某些原因,这个问题很有用。
答案 0 :(得分:0)
你的道路是正确的,但我会建议一个较小的道路:
//form/input[2]
关于NoSuchElementException
- 您可以尝试添加暂停,等待元素加载并变为selenium
的“可见”。像这样:
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
driver.get("https://www.marktplaats.nl/")
cook_button = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.XPATH, "//form[@method='post']/input[@type='submit']"))).click()
time.sleep(5) # wait 5 seconds until DOM will reload
根据问题编辑,我建议在点击按钮后添加time.sleep(5)
。出于同样的原因,因为在点击整个DOM
重新加载后,selenium
应该等到重新加载完毕。在我的计算机上完全重新加载DOM
需要大约2-3秒。