2017-08-03 69 views
0

我正在使用硒(python)网页抓取。代码中有很长的一段。所以,我正在使用循环。当我单独运行代码行时,它工作正常,但是当我使用循环时,它不工作。这里有两个错误:点击不工作硒在网页抓取使用python

WebDriverException: Message: unknown error: Element is not clickable at point (862, 13). Other element would receive the click: <div class="skycom_container">...</div> 
(Session info: chrome=46.0.2490.80) 
(Driver info: chromedriver=2.20.353145 (343b531d31eeb933ec778dbcf7081628a1396067),platform=Windows NT 6.1 SP1 x86_64) 

WebDriverException: Message: unknown error: Element is not clickable at point (924, 786). Other element would receive the click: <div id="silentUIblocker" style="display: block;"></div> 
(Session info: chrome=46.0.2490.80) 
(Driver info: chromedriver=2.20.353145 (343b531d31eeb933ec778dbcf7081628a1396067),platform=Windows NT 6.1 SP1 x86_64) 

这些常见或特定的错误? 这是在使用click()语句之前发生的。

这里是我的代码:

from selenium import webdriver 
import time 
driver = webdriver.Chrome('C:\Users\name\Downloads\chromedriver_win32 (3)\chromedriver.exe') 


driver.get('https://www.sky.com/shop/beta?s_tnt=87085:31:0') 
driver.find_element_by_xpath('//*[@id="app"]/div/div/div[2]/div/div[5]/article/button/div[1]/div[2]/div/h2').click() 
driver.find_element_by_xpath('//*[@id="app"]/div/div/div[2]/div/div[6]/section/div/div/div/div/div[1]/article/a').click() 
driver.find_element_by_xpath('//*[@id="polaris"]/div/div/div/section/div/div[2]/a[2]').click() 
driver.find_element_by_xpath('//*[@id="dsl-postcode"]').send_keys("E11 2LX") 
driver.find_element_by_xpath('//*[@id="dsl-check-landline"]').click() 
driver.find_element_by_xpath('//*[@id="dsl-addresses"]/option[2]').click() 
driver.find_element_by_xpath('//*[@id="dsl-multiple-address-select"]').click() 
driver.find_element_by_xpath('//*[@id="dsl-numberPortingNo"]').click() 
driver.find_element_by_xpath('//*[@id="dsl-number-porting-submit"]').click() 
driver.find_element_by_xpath('//*[@id="summaryBackLink"]').click() 
driver.find_element_by_xpath('//*[@id="oneOffCostToolTip"]').click() 
bb_pack = ["SKY_FIBRE_CAPPED", "BB_MAX"] 
for i in bb_pack: 
    driver.find_element_by_xpath('//*[@id="productButtonControls_%s"]/label' % i).click() 
    bb_name1.append(driver.find_element_by_xpath('//*[@id="productButtonControls_%s"]/label' % i).text) 
    pack = ["ANYTIME_EXTRA", "INTERNATIONAL_EXTRA"] 
    for j in pack: 
    driver.find_element_by_xpath('//*[@id="productButtonControls_ST_%s"]/label' % j).click() 
    bb_name2.append(driver.find_element_by_xpath('//*[@id="productButtonControls_ST_%s"]/label' % j).text) 
    #more details in this loop 
+0

考虑将你的'Chrome'升级到60.0&'chromedriver'为2.30。谢谢 – DebanjanB

+0

[Selenium Web Driver&Java可能重复。元素在点(36,72)处不可点击。其他元素会收到点击:](https://stackoverflow.com/questions/44912203/selenium-web-driver-java-element-is-not-clickable-at-point-36-72-other-el) – DebanjanB

+0

这通常发生在Dom进行更新并且webdriver尝试点击或另一个隐藏元素阻止了您的元素时。尝试在点击之间等待/休息。 –

回答

1

用流利的等待下文。它会等到你的元素没有准备好页面: -

WebElement waitsss(WebDriver driver, By elementIdentifier){ 
    Wait<WebDriver> wait = 
       new FluentWait<WebDriver>(driver).withTimeout(60, TimeUnit.SECONDS) 
               .pollingEvery(1, TimeUnit.SECONDS) 
              .ignoring(NoSuchElementException.class); 

return wait.until(new Function<WebDriver, WebElement>() 
     { 
      public WebElement apply(WebDriver driver) { 
        return driver.findElement(elementIdentifier); 
      } 
      }); 
} 

等待应该适合你。如果问题仍然存在,则使用JavascriptExecutor。它将通过JS直接操作。它应该工作。我给一个例子,点击使用JavascriptExecutor

WebElement element = driver.findElement(By.id("gbqfd")); 
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript("arguments[0].click();", element); 

我刚才看见你正在使用python的任何元素,在蟒蛇,它应该是象下面这样: -

driver.execute_script("arguments[0].click();", element) 

脚本应该像下面: -

driver.execute_script("document.getElementsByClassName('skycom_container')[0].click()") 
driver.execute_script("document.getElementById('silentUIblocker').click()") 

最终代码

driver = webdriver.Chrome('C:\Users\name\Downloads\chromedriver_win32 (3)\chromedriver.exe') 
    driver.implicitly_wait(30) # seconds 
    driver.get('https://www.sky.com/shop/beta?s_tnt=87085:31:0') 
    driver.find_element_by_xpath('//*[@id="app"]/div/div/div[2]/div/div[5]/article/button/div[1]/div[2]/div/h2').click() 
    element=driver.find_element_by_xpath('//*[@id="app"]/div/div/div[2]/div/div[6]/section/div/div/div/div/div[1]/article/a') 
    driver.execute_script("arguments[0].click();", element) 
    driver.find_element_by_xpath('//*[@id="polaris"]/div/div/div/section/div/div[2]/a[2]').click() 
    driver.find_element_by_xpath('//*[@id="dsl-postcode"]').send_keys("E11 2LX") 
    driver.find_element_by_xpath('//*[@id="dsl-check-landline"]').click() 
    driver.find_element_by_xpath('//*[@id="dsl-addresses"]/option[2]').click() 
    driver.find_element_by_xpath('//*[@id="dsl-multiple-address-select"]').click() 
    driver.find_element_by_xpath('//*[@id="dsl-numberPortingNo"]').click() 
    driver.find_element_by_xpath('//*[@id="dsl-number-porting-submit"]').click() 
    driver.find_element_by_xpath('//*[@id="summaryBackLink"]').click() 
    driver.find_element_by_xpath('//*[@id="oneOffCostToolTip"]').click() 

希望它会帮助你:)

+0

你能告诉我python的确切代码行吗? Thanx提前.. :) –

+0

按照下面的链接,如果你有类名或ID,你可以直接点击..参考: - https://stackoverflow.com/questions/36987006/how-to-click-a-javascript-按钮与硒 –

+0

是否有可能通过我的代码,并帮助我? –

1

尝试只是让click()前添加以下的进口

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

,插入下面一行:

WebDriverWait(driver, 10).until(EC.invisibility_of_element_located((By.ID, "silentUIblocker"))) 

这应该让你等到元素拦截点击消失

+0

是的,它的工作原理。我刚刚添加了另一个错误。你能看到吗? –

+0

尝试用相同的方式解决:'WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CLASS_NAME,“skycom_container”)))' – Andersson

+0

仍然没有完成...得到这个错误: C:\ Anaconda2 (),> end_time: 79 break ---> 80 raise TimeoutException(message, screen,stacktrace) 82 def until_not(self,method,message ='): TimeoutException:消息: –