selenium expected condition presence_of_element_locatedメソッドの引数はtupple

 



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や要素の有無を再確認してください。


コメント