# WebDriver小技巧 ###### tags: `自動化` `模擬` 我的環境: windows 11 pro 使用語言: php 使用瀏覽器: chrome ## 錯誤處理 ### 使用cssSelector發生錯誤:invalid selector: An invalid or illegal selector was specified 正確方法 `WebDriverBy::cssSelector('div>div[data-toggle=modal]')` 有問題的方法 `WebDriverBy::cssSelector('#blackListModal div.modal-body input:checkbox')` WebDriverBy::cssSelector畢竟不是jQuery, 使用時還是先測試一下比較好 ### 找不到元素 另外若發現使用`$driver->findElement(WebDriverBy::XXX)`會因為找不到元素而直接掛掉 可改用`$driver->findElements(WebDriverBy::XXX)`取得元素集合, (findElement**s**,有多一個s) 若是空元素則代表沒找到元素 ### 元件當前無法互動 也許是因為被其他元件遮擋、或當前不可見沒有顯示、或元件已被異動而直接掛掉 這時改用js觸發即可 ## 使用案例 ### 如何調整預設下載位置 以chrome為例,以下是我正在使用的參數 ```php= $options = new ChromeOptions(); // 調整下載位置 $downloadPath = __DIR__ . '\\tmp\\download'; $options->setExperimentalOption('prefs', [ 'download.default_directory' => $downloadPath, 'download.prompt_for_download' => false, 'download.directory_upgrade' => true, 'safebrowsing.enabled' => true ]); $options->addArguments([ '--window-size=1400,900', // 指定瀏覽器的解析度 '--disable-gpu', // google document 提到需要加上這個屬性來規避 bug '--no-sandbox', // 以最高權限運行 '--headless', // 不用打開圖形介面 ]); ``` ### 如何取得該頁面原始碼 頁面原始碼 ```php= $driver->get('https://drive.google.com/drive/u/0/folders/1Iv4DmlkPxi-jq6jyL0uzv7EXhwZNZ8wV'); $html = $driver->getPageSource(); ``` ### 如何等待AJAX跑完 see. https://stackoverflow.com/a/64682701 ```php= $driver->wait()->until( function ($driver) { return $driver->executeScript('return jQuery.active === 0;'); } ); ``` ### 等待頁面載入完畢 see. [參考](https://webcache.googleusercontent.com/search?q=cache:hxBVuvFG6OsJ:https://stackoverflow.com/questions/5868439/wait-for-page-load-in-selenium+&cd=1&hl=zh-TW&ct=clnk&gl=tw ```php= $driver->wait()->until( function ($driver) { return $driver->executeScript("return document.readyState === 'complete';"); } ); ``` ### 無法大量下載檔案 要啟用這個參數 profile.default_content_setting_values.automatic_downloads ```php= $this->options->setExperimentalOption('prefs', [ 'download.default_directory' => $this->downloadPath, 'download.prompt_for_download' => false, 'download.directory_upgrade' => true, 'safebrowsing.enabled' => true, 'profile.default_content_settings.popups' => false, 'profile.default_content_setting_values.automatic_downloads' => 1, // 同意下載多個檔案 ]); ``` ### 確認/等待登入跳轉 ```php= $driver->get('https://example.com/'); // 等待網址出現home或是login的關鍵字 $wait = new WebDriverWait($driver, 15); $wait->until( function () use ($driver) { $currentUrl = $driver->getCurrentUrl(); // 這裡需要根據你的 WebDriver 函式庫來獲取當前網址 return strpos($currentUrl, '/home') !== false || strpos($currentUrl, '/login') !== false; } ); ```