Selenium 处理弹出窗口&Google 自动完成
Selenium handling pop-up&Google Autocomplete
我正在尝试使用 selenium 从 http://www.gps-coordinates.net/ 进行网页抓取,但我在 2 个方面遇到了问题。
- Google 自动完成导致我无法点击“获取”
坐标”按钮。我试图解决它,但有时它仍然
不工作。 (消息:元素在点 (280, 17.800003051757812) 不可点击。其他元素将收到点击)
- 弹窗提示没有结果,我还是无法处理弹窗
`
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
我正在尝试使用 selenium 从 http://www.gps-coordinates.net/ 进行网页抓取,但我在 2 个方面遇到了问题。
- Google 自动完成导致我无法点击“获取” 坐标”按钮。我试图解决它,但有时它仍然 不工作。 (消息:元素在点 (280, 17.800003051757812) 不可点击。其他元素将收到点击)
- 弹窗提示没有结果,我还是无法处理弹窗
`
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