presence_of_element_locatedメソッドは
メソッド( , ) ではなくて、
メソッド( ( , ) )
というtuppleを引数とするメソッドだった。
-----------------------------------------------------------------
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.edge.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager
class DemoFindElementByXPathWithText:
def locate_by_xpath_and_text(self):
driver = None
try:
# Initialize the Chrome driver
# driver = webdriver.Chrome(ChromeDriverManager().install())
service
= Service(EdgeChromiumDriverManager().install())
driver
= webdriver.Edge(service=service)
# Open the specified URL
driver.get("https://www.amazon.co.jp/ref=ap_frn_logo")
# Wait for the desired element
# to appear before interacting with it
WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
By.XPATH, "//h2[contains(text(),'売れ筋ランキング')]")
)
# Find element by XPath and get its text
text = driver.find_element( By.XPATH, "//h2[contains(text(),'売れ筋ランキング')]" ).text
# Find element by Link Text
text1 = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
By.XPATH, "//h2[contains(text(),'事前エントリー受付中')]" )
).text
# Print the retrieved text
print(text)
print(text1)
except Exception as e:
print(f"An error occurred: {e}")
finally:
if driver:
# Ensure the browser is closed properly
driver.quit()
# Instantiate the class and call the method
findElm = DemoFindElementByXPathWithText()
findElm.locate_by_xpath_and_text()
selenium with python を使った上記のコードを実行してみると、
presence_of_element_located
のところで、
An error occurred:
presence_of_element_located() takes 1 positional argument
but 2 were given
のエラーが表示されてしまいました。
で、上記のコードには2か所そのメソッドが記述してありますが、
どちらのほうにエラーがあるのでしょうか?
修正するにはどのようにすればいいのでしょうか?
エラーの原因は、`presence_of_element_located()` に渡している
引数の書き方が間違っているためです。
このメソッドは **1つの引数** を必要とし、
その引数は `By` と値をまとめたタプルです。
### エラーが出る箇所
コードには次の2か所で
`presence_of_element_located()` を使用していますが、
どちらも同じ間違いがあります。
```python
EC.presence_of_element_located(
By.XPATH, "//h2[contains(text(),'売れ筋ランキング')]")
```
またはこちら:
```python
EC.presence_of_element_located(
By.XPATH, "//h2[contains(text(),'事前エントリー受付中')]")
```
### 修正方法
`presence_of_element_located()`
は次のように修正する必要があります。
```python
EC.presence_of_element_located(
(By.XPATH, "//h2[contains(text(),'売れ筋ランキング')]"))
```
またはこちら:
```python
EC.presence_of_element_located(
(By.XPATH, "//h2[contains(text(),'事前エントリー受付中')]"))
```
注意すべき点は、
`By.XPATH` と XPath の文字列を **括弧でくくって
タプルとして渡す必要がある** ことです。
### 修正後のコード
以下が修正後のコード全体です:
```python
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.edge.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager
class DemoFindElementByXPathWithText:
def locate_by_xpath_and_text(self):
driver = None
try:
# Initialize the Edge driver
service = Service(EdgeChromiumDriverManager().install())
driver = webdriver.Edge(service=service)
# Open the specified URL
driver.get("https://www.amazon.co.jp/ref=ap_frn_logo")
# Wait for the desired element to appear before interacting with it
WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
(By.XPATH, "//h2[contains(text(),'売れ筋ランキング')]"))
)
# Find element by XPath and get its text
text = driver.find_element(
By.XPATH, "//h2[contains(text(),'売れ筋ランキング')]").text
# Find element by Link Text
text1 = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
(By.XPATH, "//h2[contains(text(),'事前エントリー受付中')]"))
).text
# Print the retrieved text
print(text)
print(text1)
except Exception as e:
print(f"An error occurred: {e}")
finally:
if driver:
# Ensure the browser is closed properly
driver.quit()
# Instantiate the class and call the method
findElm = DemoFindElementByXPathWithText()
findElm.locate_by_xpath_and_text()
```
### 主な修正点
- `EC.presence_of_element_located()`
の引数をタプルとして渡すように修正しました。
```python
EC.presence_of_element_located(
(By.XPATH, "<XPath文字列>"))
```
### 結果
これでエラーは解消され、
指定したXPathに該当する要素が正しく待機・取得できるはずです。
ただし、対象の要素が存在しない場合やページ構造が変わっている場合、
他のエラーが発生する可能性があります。
その場合は、XPathや要素の有無を再確認してください。
コメント
コメントを投稿