如何定制一款12306抢票浏览器――实现自动查询和预定功能(二)
rameNamedMainDoc(spIFramePageDoc, spMainDoc);
CHECKHRPOINTER(hr, spMainDoc);
} while (0);
return hr;
}
当我们获得最里层的Doc后,我们将根据页面结构获取Class为cx_from的Table元素。
获取这个Table的原因是,之后我们会以该Table为节点,执行“查询按钮”查找的操作。
[cpp]
HRESULT CDeal12306WebPage::GetQueryButtonInQueryPage( CComPtr & spDoc, CComPtr & spQueryButtonElem )
{
HRESULT hr = E_FAIL;
do {
CComPtr spMainDoc;
hr = GetMainDoc( spDoc, spMainDoc);
CHECKHRPOINTER(hr, spMainDoc);
CComPtr spEnter_wElem;
hr = GetEnter_wElement(spMainDoc, spEnter_wElem );
CHECKHRPOINTER(hr, spEnter_wElem);
CComPtr spQueryTable;
hr = GetQueryTable(spEnter_wElem, spQueryTable);
CHECKHRPOINTER(hr, spQueryTable);
CComPtr spQueryButton;
hr = GetQueryButtonInQueryPage(spQueryTable, spQueryButton);
CHECKHRPOINTER(hr, spQueryButton);
hr = spQueryButton->QueryInterface(IID_IHTMLElement, (LPVOID*)& spQueryButtonElem);
CHECKHRPOINTER(hr, spQueryButtonElem);
} while (0);
return hr;
}
查询按钮在这个table中的位置是
于是通过该Table查询”查询“按钮的代码是
[cpp]
HRESULT CDeal12306WebPage::GetQueryButtonInQueryPage( CComPtr& spQueryTable,
CComPtr & spQueryButton )
{
HRESULT hr = E_FAIL;
do {
CComPtr spTBody;
hr = GetElementByIndex(spQueryTable, 0, spTBody);
CHECKHRPOINTER(hr, spTBody);
CComPtr spFirstTR;
hr = GetElementByIndex(spTBody, 0, spFirstTR);
CHECKHRPOINTER(hr, spFirstTR);
CComPtr spEighthTR;
hr = GetElementByIndex(spFirstTR, 8, spEighthTR);
CHECKHRPOINTER(hr, spEighthTR);
CComPtr spButtonTemp;
hr = GetElementByIndex(spEighthTR, 0, spButtonTemp);
CHECKHRPOINTER(hr, spButtonTemp);
hr = spButtonTemp->QueryInterface(IID_IHTMLButtonElement, (LPVOID*)&spQueryButton);
CHECKHRPOINTER(hr, spQueryButton);
} while (0);
return hr;
}
插入开始和停止自动查询按钮
为了在该页面中提供给用于控制开启和关闭自动查询功能的按钮,我插入了两个按钮。如下图
我们看下”单程“和”返程“按钮的页面结构
我会在Name为querySingleForm的form下的class为cx_tab的Div下插入“开始”和“停止”按钮。
[cpp]
HRESULT CDeal12306WebPage::InsertButtonInQueryPage( CComPtr & spDoc )
{
HRESULT hr = E_FAIL;
do {
CComPtr spMainDoc;
hr = GetMainDoc( spDoc, spMainDoc);
CHECKHRPOINTER(hr, spMainDoc);
CComPtr spEnter_wElem;
hr = GetEnter_wElement(spMainDoc, spEnter_wElem );
CHECKHRPOINTER(hr, spEnter_wElem);
CComPtr spForm;
hr = GetQuerySingleForm(spEnter_wElem, spForm);
CHECKHRPOINTER(hr, spForm);
hr = InsertButtons( spForm );
} while (0);
return hr;
}
[cpp]
HRESULT CDeal12306WebPage::InsertButtons(CComPtr & spEnter_wElem )
{
HRESULT hr = E_FAIL;
do {
CComPtr spDiv;
hr = GetInsertButtonElem(spEnter_wElem, spDiv);
if ( FALSE == IsStartButtonExist(spDiv) ) {
hr = InsertStartButton(spDiv);
CHECKHR(hr);
#ifdef DEBUG
if ( FALSE == IsStartButtonExist(spDiv) ) {
DebugBreak();