# 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;
}
);
```