Seleniumの一般的なコマンド
Chromeリモートデバッグ
ブラウザが自動プログラムによって制御されていると検出されないようにするために、セレンと組み合わせたChromeのリモートデバッグを使用して、監視をバイパスするようにChromeをリモートで制御できます。
最初にcmdを使用して、chrome.exeの起動用に追加の起動パラメータを追加します
# 如果chrome.exe未在环境变量中配置,需进入目录下运行
cd C:\Program Files (x86)\Google\Chrome\Application
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile" --profile-directory="Profile 1"
- 占有されていないポートに注意してください
- user-data-dir:設定ファイルのディレクトリを指定し、デフォルトのユーザーを使用して無視できます
- profile-directoryはブラウザーのユーザーを指定します。デフォルトのユーザーは無視できます
一般的なChrome構成設定
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
chrome_options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
# 添加User-Agent
chrome_options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
chrome_options.add_argument('--proxy-server=http://') # 使用代理IP登录浏览器
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 使用远程调试端口操作浏览器,避免被监测为正在使用自动化程序控制
# 禁用浏览器弹窗
prefs = {
'profile.default_content_setting_values' : {
'notifications' : 2 }}
chrome_options.add_experimental_option('prefs',prefs)
#禁止插件
chrome_options.add_argument('--disable-plugins')
# 禁用弹出拦截
chrome_options.add_argument('--disable-popup-blocking')
from selenium import webdriver
# 创建WebDriver对象(通常默认为wd),指明Chrome浏览器驱动,并添加上述配置
wd = webdriver.Chrome(
executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',
options=chrome_options,
)
- executable_pathは、ダウンロードされたchromedriver.exeのパスです。Python環境に配置されている場合は、このオプションを無視できます
Webdriverの一般的な手順
- ブラウザのウィンドウサイズを設定する
# 窗口最大化
wd.maximize_window()
# 设置窗口指定大小
wd.set_window_size(1920, 1080)
- ブラウザに指定されたURLを開かせる
wd.get('https://www.baidu.com')
- 最大待機時間を設定する
from selenium.webdriver.support.ui import WebDriverWait
wait = WebDriverWait(driver, 15)
- ブラウザウィンドウを閉じます
wd.close() # 关闭当前窗口
wd.quit() # 关闭浏览器
ブラウザで要素を表示して選択する
Web要素の特性を検索する場合。ブラウザの開発者ツールバーを使用して、Web要素を表示および選択することができます。(要素を選択し、右クリックして確認します。ページに対応するHTML要素を表示できます)
位置決め要素
wd = webdriver.Chrome()
上記の手順を通じて、WebDriverタイプのオブジェクトをwdに割り当てます。これにより、このオブジェクトを使用して、URLを開く、インターフェイス要素を選択するなど、ブラウザーを制御できます。
以下のコード
wd.find_element_by_id('kw')
WebDriverオブジェクトのメソッドfind_element_by_idを使用し、
WebDriverオブジェクトの要素を見つける方法はたくさんあります。それらの中には:
# 根据 元素的id 属性选择元素
find_element_by_id
# 根据 class属性、tag名 选择元素
find_element_by_tag_name
find_element_by_class_name
# 根据 元素的css 属性选择元素
find_element_by_css_selector
# 根据xpath来选择元素
find_element_by_xpath
id属性に基づいて要素を選択します
上記のhtmlのタグの属性に従って、属性値がkwであるid属性を見つけることができます。
HTMLでは、要素の番号としてidを使用できます。要素にid属性がある場合、このidは一意で一意です。
したがって、要素にIDがある場合、それはIDに基づいて要素を見つける最も簡単で効率的な方法です。
例:
wd.find_element_by_id('kw')
ブラウザーがidがkwの要素を見つけると、ブラウザードライバーを介して結果を自動化プログラムに返します。そのため、find_element_by_idメソッドはWebElementタイプのオブジェクトを返します。このWebElementオブジェクトを介して、対応するインターフェイス要素を操作できます。
# 找到元素后点击
wd.find_element_by_id('kw').click()
# 找到元素后传递字符串
wd.find_element_by_id('kw').send_keys('')
要素のクラス属性とタグ名に基づいて要素を選択します
要素のidに加えて、要素のclass属性に基づいて要素を選択することもできます。
要素にはタイプがあり、クラス属性は要素のタイプをマークするために使用されます。特定のhtmlページでは、要素のタイプが同じである可能性があるため、find_elementsを使用して、実際の配置で同じタイプのすべての要素を見つけることができます。
例えば:
wd.find_elements_by_class_name('s_ipt')
同様に、メソッドfind_elements_by_tag_nameを使用して、タグ名が入力されているすべての要素を選択できます
wd.find_elements_by_tag_name('input')
注意:
WebElementオブジェクトtext属性
を使用すると、Webページ内の要素のテキストコンテンツを取得できます。
element = wd.find_elements_by_class_name('s_ipt')
print(element.text)
上記のいずれの方法でもコントロールを特定できない場合は、おそらくiframe内にあります。以下はiframeに切り替える方法です
driver.switch_to.frame() #转入网页内iframe(内嵌的网页元素)
driver.switch_to.parent_frame() #切回上一层frame
driver.switch_to_default_content() #返回到主页面
find_elementとfind_elementsの違い
find_elementsを使用して、条件を満たすすべての要素を選択します。条件を満たす要素がない場合は、空のリストを返します
find_elementを使用して、条件を満たす最初の要素を選択します。条件を満たす要素がない場合は、NoSuchElementExceptionをスローします。
Webウィンドウを切り替える
driver.execute_script('window.open()') # 开启一个选项卡
windows=driver.window_handles # 获得当前浏览器所有窗口
driver.switch_to.window(windows[0]) # 切换到最左侧窗口
driver.switch_to.window(windows[-1]) # 切换到最新打开窗口(注:也就是最右侧窗口)
フォームを送信
submit()メソッドは、特に送信ボタンがない場合にフォームを送信するために使用されます
たとえば、検索ボックスにキーワードを入力した後の「Enter」操作では、submit()を使用して検索ボックスのコンテンツを送信できます。
driver.find_element_by_id('query').submit()
ページ情報を取得する
driver.current_url # 获取当前网址
driver.page_source # 获取源代码
driver.title # 获取当前页面标题内容
driver.delete_all_cookies() # 删除所有cookie
driver.add_cookie({
'name':5}) # 添加cookie
- クッキーを取得
driver.get_cookies()
cookie_list = []
for dict in cookies:
cookie = dict['name'] + '=' + dict['value']
cookie_list.append(cookie)
cookie = ';'.join(cookie_list)
暗黙的な待機と明示的な待機
暗黙の待機
要素が見つからない場合、要素が見つからないというエラーはすぐには返されません。代わりに、要素が見つかるまで、または指定された最大待機時間を超えるまで、定期的に(0.5秒ごとに)要素を探し、例外がスローされます(find_elementsなどのメソッドの場合、空のリストが返されます)。 。
SeleniumのWebdriverオブジェクトには、 implicitly_wait
このメソッドは、最大待機時間を指定するパラメーターを受け入れます。
# 设置缺省等待时间
driver.implicitly_wait(10)
明示的な待機
名前が示すように、明示的な待機とは、コードの実行後に固定待機時間を設定し、実行を継続することです。これは、timeモジュールの一般的に使用されるスリープメソッドです。
このメソッドは、最大待機時間を指定するパラメーターを受け入れます。
import time
time.sleep(1)
川オブジェクトには、 implicitly_wait
このメソッドは、最大待機時間を指定するパラメーターを受け入れます。
# 设置缺省等待时间
driver.implicitly_wait(10)
明示的な待機
名前が示すように、明示的な待機とは、コードの実行後に固定待機時間を設定し、実行を継続することです。これは、timeモジュールの一般的に使用されるスリープメソッドです。
このメソッドは、最大待機時間を指定するパラメーターを受け入れます。
import time
time.sleep(1)