Selenium 处理弹出窗口&Google 自动完成

Selenium handling pop-up&Google Autocomplete

我正在尝试使用 selenium 从 http://www.gps-coordinates.net/ 进行网页抓取,但我在 2 个方面遇到了问题。

  1. Google 自动完成导致我无法点击“获取” 坐标”按钮。我试图解决它,但有时它仍然 不工作。 (消息:元素在点 (280, 17.800003051757812) 不可点击。其他元素将收到点击)
  2. 弹窗提示没有结果,我还是无法处理弹窗

`

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
import openpyxl
import xlsxwriter
import pyperclip

driver = ""

def setup():
    global driver
    driver = webdriver.Firefox()
    driver.get("http://www.gps-coordinates.net/")
    assert 'Google Map' in driver.title

def sele(address):
    setup()
    global driver
    query = driver.find_element_by_id('address')
    query.clear()
    query.send_keys(address)
    query.send_keys(Keys.RETURN)
    driver.implicitly_wait(0.7)
    query.send_keys(Keys.DOWN) #To solve in case there is autocomplete by Google
    query.send_keys(Keys.RETURN)
    button = driver.find_element_by_xpath("//*[@id='wrap']/div[2]/div[4]/div[1]/form[1]/div[2]/div/button")
    button.click()
    driver.implicitly_wait(0.7)
    if EC.alert_is_present(): #If there is a popup, that means there is no result for the geocoding
        alert=driver.switch_to_alert()
        alert.accept()
        latlong = ['Fail','Fail']
        return latlong
    else:  
        latraw = driver.find_element_by_id('latitude')  
        longraw = river.find_element_by_id('longitude')  
        latraw.send_keys(Keys.CONTROL,'A')  
        latraw.send_keys(Keys.CONTROL,'C')
        lat = pyperclip.paste()
        latraw.clear()
        longraw.send_keys(Keys.CONTROL,'A')
        longraw.send_keys(Keys.CONTROL,'C')
        long = pyperclip.paste()
        latraw.clear()
        return [lat,long]

我用这段代码解决了我的问题:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
import openpyxl
import xlsxwriter
import pyperclip

driver = ""

def setup():
    global driver
    driver = webdriver.Firefox()
    driver.get("http://www.gps-coordinates.net/")
    assert 'Google Map' in driver.title

def sele(address):
    global driver
    query = driver.find_element_by_id('address')
    query.clear()
    query.send_keys(address)
    query.send_keys(Keys.RETURN)
    driver.implicitly_wait(0.7)
    query.send_keys(Keys.DOWN) #To solve in case there is autocomplete by Google
    query.send_keys(Keys.RETURN)
    button = driver.find_element_by_xpath("//*[@id='wrap']/div[2]/div[4]/div[1]/form[1]/div[2]/div/button")
    button.click()
    driver.implicitly_wait(0.7)
    try:
        alert=driver.switch_to_alert()
        alert.accept()
        latlong = ['Fail','Fail']
        return latlong
    except Exception :
        latraw = driver.find_element_by_id('latitude')
        longraw = driver.find_element_by_id('longitude')
        newquery = driver.find_element_by_id('address')
        lat = latraw.get_attribute('value')
        long = longraw.get_attribute('value')
        query = newquery.get_attribute('value')
        return [lat,long,query]

def wrapper(inputad,outputad,k):
    InFile = openpyxl.load_workbook(inputad)
    Sheet = InFile['Sheet1']
    workbook = xlsxwriter.Workbook(outputad)
    worksheet = workbook.add_worksheet()
    TotalLength = Sheet.max_row
    ProgressChecker = 0

    for i in range(1, TotalLength +1):
        ProgressChecker = ProgressChecker + 1
        addtext = Sheet[i][k].value
        try:
            latlong = sele(addtext)
            worksheet.write(i,0,addtext)
            worksheet.write(i,1,latlong[0])
            worksheet.write(i,2,latlong[1])
            worksheet.write(i,2,latlong[2])
            print("Progress: ", ProgressChecker, " out of " ,TotalLength)
        except Exception :
            worksheet.write(i,0,addtext)
            worksheet.write(i,1,"Failure Inside Iteration")
            print("Progress: ", ProgressChecker, " out of " ,TotalLength)
            continue
    complete = "complete"
    return complete