当代码由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(( 中工作正常,由于某种原因,这个有问题。
你的路径是正确的,但我建议一个较小的路径:
//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 秒。